security: fix obfuscation via HMAC per-packet mask and cap server sessions at 1024

This commit is contained in:
ospab 2026-05-15 18:24:35 +03:00
parent 6e35609f42
commit 77b0d55f39
798 changed files with 22932 additions and 48 deletions

10
Cargo.lock generated
View File

@ -356,6 +356,15 @@ version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
[[package]]
name = "hmac"
version = "0.12.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e"
dependencies = [
"digest",
]
[[package]]
name = "inout"
version = "0.1.4"
@ -512,6 +521,7 @@ dependencies = [
"async-trait",
"bytes",
"chacha20poly1305",
"hmac",
"rand",
"sha2",
"snow",

View File

@ -25,4 +25,5 @@ tokio = { version = "1.37", features = ["rt-multi-thread", "macros", "net", "tim
tracing = "0.1"
x25519-dalek = "2"
sha2 = "0.10"
hmac = "0.12"
portable-atomic = "1.10"

View File

@ -15,3 +15,4 @@ thiserror.workspace = true
tracing.workspace = true
x25519-dalek.workspace = true
sha2.workspace = true
hmac.workspace = true

View File

@ -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] {
use sha2::Digest;
let mut hasher = Sha256::new();
hasher.update(access_key);
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] {
use sha2::Digest;
let mut hasher = Sha256::new();
hasher.update(access_key);
hasher.update(b"-ostp-psk-salt");
@ -19,72 +23,66 @@ pub fn derive_psk(access_key: &[u8]) -> [u8; 32] {
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) {
if !is_handshake && raw.len() >= 12 {
// Data packet
let mut session_id_bytes = [raw[0], raw[1], raw[2], raw[3]];
let mut nonce_bytes = [
// Read nonce from bytes 4..12 (plaintext on wire)
let nonce = u64::from_be_bytes([
raw[4], raw[5], raw[6], raw[7],
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]
raw[8], raw[9], raw[10], raw[11],
]);
let nonce_low_32 = (real_nonce & 0xFFFFFFFF) as u32;
let nonce_low_bytes = nonce_low_32.to_be_bytes();
// Mask only session_id bytes using nonce-derived mask
let mask = derive_session_mask(key, nonce);
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);
// nonce bytes 4..12 remain as-is (plaintext, authenticated by AEAD)
} 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 {
raw[i] ^= key[i % 8];
raw[i] ^= mask[i];
}
}
}
pub fn deobfuscate_packet_inplace(raw: &mut [u8], key: &[u8; 8], is_handshake: bool) {
if !is_handshake && raw.len() >= 12 {
// Data packet
let mut nonce_bytes = [
// Read nonce plaintext from bytes 4..12
let nonce = u64::from_be_bytes([
raw[4], raw[5], raw[6], raw[7],
raw[8], raw[9], raw[10], raw[11]
];
// 1. Recover real nonce by XORing with key
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]];
raw[8], raw[9], raw[10], raw[11],
]);
// Derive same mask and unmask session_id
let mask = derive_session_mask(key, nonce);
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 {
// Handshake packet
let mask = derive_session_mask(key, u64::MAX);
for i in 0..4 {
raw[i] ^= key[i % 8];
raw[i] ^= mask[i];
}
}
}

View File

@ -5,6 +5,10 @@ use std::collections::HashMap;
use std::net::SocketAddr;
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 {
Unauthorized,
Accepted {
@ -198,6 +202,11 @@ impl Dispatcher {
}
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);
machine.set_session_keys(candidate_session_id, obf_key);

View File

@ -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":{}}

View File

View File

@ -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}

View File

@ -0,0 +1 @@
This file has an mtime of when this was started.

View File

@ -0,0 +1 @@
This file has an mtime of when this was started.

View File

@ -0,0 +1 @@
d449f2372c77bea1

View File

@ -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}

View File

@ -0,0 +1 @@
This file has an mtime of when this was started.

View File

@ -0,0 +1 @@
9acbf29577b06a2d

View File

@ -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}

View File

@ -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}

View File

@ -0,0 +1 @@
This file has an mtime of when this was started.

View File

@ -0,0 +1 @@
This file has an mtime of when this was started.

View File

@ -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}

View File

@ -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}

View File

@ -0,0 +1 @@
This file has an mtime of when this was started.

View File

@ -0,0 +1 @@
This file has an mtime of when this was started.

View File

@ -0,0 +1 @@
a4e1775341789077

View File

@ -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}

View File

@ -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}

View File

@ -0,0 +1 @@
This file has an mtime of when this was started.

View File

@ -0,0 +1 @@
This file has an mtime of when this was started.

View File

@ -0,0 +1 @@
8edb051a64420d3a

View File

@ -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}

View File

@ -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}

View File

@ -0,0 +1 @@
This file has an mtime of when this was started.

View File

@ -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}

View File

@ -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}

View File

@ -0,0 +1 @@
This file has an mtime of when this was started.

View File

@ -0,0 +1 @@
c23bbf0f9fff5380

View File

@ -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}

View File

@ -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}

View File

@ -0,0 +1 @@
This file has an mtime of when this was started.

View File

@ -0,0 +1 @@
This file has an mtime of when this was started.

View File

@ -0,0 +1 @@
5b54acba8c8772f6

View File

@ -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}

View File

@ -0,0 +1 @@
This file has an mtime of when this was started.

View File

@ -0,0 +1 @@
aec89c8e3b489c1d

View File

@ -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}

View File

@ -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}

View File

@ -0,0 +1 @@
This file has an mtime of when this was started.

View File

@ -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}

View File

@ -0,0 +1 @@
This file has an mtime of when this was started.

View File

@ -0,0 +1 @@
This file has an mtime of when this was started.

View File

@ -0,0 +1 @@
4819137ca3bee237

View File

@ -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}

View File

@ -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}

View File

@ -0,0 +1 @@
This file has an mtime of when this was started.

View File

@ -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}

View File

@ -0,0 +1 @@
This file has an mtime of when this was started.

View File

@ -0,0 +1 @@
This file has an mtime of when this was started.

View File

@ -0,0 +1 @@
59e5290f220c9f6a

View File

@ -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}

View File

@ -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}

View File

@ -0,0 +1 @@
This file has an mtime of when this was started.

View File

@ -0,0 +1 @@
This file has an mtime of when this was started.

View File

@ -0,0 +1 @@
7df09e4b33b1d848

View File

@ -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}

Some files were not shown because too many files have changed in this diff Show More