hardware_enclave/internal/core/
signing.rs1#![allow(dead_code, unused_imports, unused_qualifications, unreachable_patterns)]
10
11use std::sync::OnceLock;
12
13const UNSIGNED_SUFFIX: &str = "-unsigned";
14
15pub fn is_binary_signed() -> bool {
28 static RESULT: OnceLock<bool> = OnceLock::new();
29 *RESULT.get_or_init(|| {
30 let Ok(exe) = std::env::current_exe() else {
31 return false;
32 };
33 let path = exe.to_string_lossy();
34 if path.contains("/target/") || path.contains("\\target\\") {
35 return false;
36 }
37 is_codesigned(&exe)
38 })
39}
40
41#[cfg(target_os = "macos")]
42fn is_codesigned(exe: &std::path::Path) -> bool {
43 std::process::Command::new("codesign")
44 .args(["--verify", "--no-strict"])
45 .arg(exe)
46 .output()
47 .map(|o| o.status.success())
48 .unwrap_or(false)
49}
50
51#[cfg(not(target_os = "macos"))]
52fn is_codesigned(_exe: &std::path::Path) -> bool {
53 true
54}
55
56pub fn ensure_safe_app_name(app_name: &str) -> String {
64 if is_binary_signed() || app_name.ends_with(UNSIGNED_SUFFIX) {
65 app_name.to_string()
66 } else {
67 format!("{app_name}{UNSIGNED_SUFFIX}")
68 }
69}
70
71#[cfg(test)]
72mod tests {
73 use super::*;
74
75 #[test]
76 fn unsigned_binary_gets_suffix() {
77 assert_eq!(ensure_safe_app_name("gocode-dev"), "gocode-dev-unsigned");
78 assert_eq!(ensure_safe_app_name("sshenc"), "sshenc-unsigned");
79 }
80
81 #[test]
82 fn already_suffixed_not_doubled() {
83 assert_eq!(
84 ensure_safe_app_name("gocode-dev-unsigned"),
85 "gocode-dev-unsigned"
86 );
87 }
88
89 #[test]
90 fn is_binary_signed_false_in_tests() {
91 assert!(!is_binary_signed());
92 }
93}