urma_node/platform/service_sid.rs
1//! The per-service SID Windows derives from a service name: SHA-1 over the
2//! upper-cased UTF-16LE name, read as five little-endian sub-authorities.
3use sha1::{Digest, Sha1};
4
5pub fn service_sid(name: &str) -> String {
6 let mut hasher = Sha1::new();
7 for unit in name.to_uppercase().encode_utf16() {
8 hasher.update(unit.to_le_bytes());
9 }
10 let digest = hasher.finalize();
11 let parts: Vec<String> = digest
12 .as_chunks::<4>()
13 .0
14 .iter()
15 .map(|chunk| u32::from_le_bytes(*chunk).to_string())
16 .collect();
17 format!("S-1-5-80-{}", parts.join("-"))
18}