Trim leading zeros in cert

This commit is contained in:
nab138
2025-11-14 17:23:33 -05:00
parent a8c755b7c6
commit 633bb0f102
6 changed files with 51 additions and 50 deletions

2
Cargo.lock generated
View File

@@ -981,7 +981,7 @@ checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130"
[[package]] [[package]]
name = "isideload" name = "isideload"
version = "0.1.16" version = "0.1.17"
dependencies = [ dependencies = [
"hex", "hex",
"idevice", "idevice",

View File

@@ -3,7 +3,7 @@ name = "isideload"
description = "Sideload iOS/iPadOS applications" description = "Sideload iOS/iPadOS applications"
license = "MPL-2.0" license = "MPL-2.0"
authors = ["Nicholas Sharp <nab@nabdev.me>"] authors = ["Nicholas Sharp <nab@nabdev.me>"]
version = "0.1.16" version = "0.1.17"
edition = "2024" edition = "2024"
repository = "https://github.com/nab138/isideload" repository = "https://github.com/nab138/isideload"
documentation = "https://docs.rs/isideload" documentation = "https://docs.rs/isideload"

View File

@@ -21,9 +21,10 @@ impl Bundle {
let mut bundle_path = bundle_dir; let mut bundle_path = bundle_dir;
// Remove trailing slash/backslash // Remove trailing slash/backslash
if let Some(path_str) = bundle_path.to_str() if let Some(path_str) = bundle_path.to_str()
&& (path_str.ends_with('/') || path_str.ends_with('\\')) { && (path_str.ends_with('/') || path_str.ends_with('\\'))
bundle_path = PathBuf::from(&path_str[..path_str.len() - 1]); {
} bundle_path = PathBuf::from(&path_str[..path_str.len() - 1]);
}
let info_plist_path = bundle_path.join("Info.plist"); let info_plist_path = bundle_path.join("Info.plist");
assert_bundle( assert_bundle(
@@ -158,13 +159,15 @@ fn find_dylibs(dir: &Path, bundle_root: &Path) -> Result<Vec<String>, Error> {
if file_type.is_file() { if file_type.is_file() {
if let Some(name) = path.file_name().and_then(|n| n.to_str()) if let Some(name) = path.file_name().and_then(|n| n.to_str())
&& name.ends_with(".dylib") { && name.ends_with(".dylib")
// Get relative path from bundle root {
if let Ok(relative_path) = path.strip_prefix(bundle_root) // Get relative path from bundle root
&& let Some(relative_str) = relative_path.to_str() { if let Ok(relative_path) = path.strip_prefix(bundle_root)
libraries.push(relative_str.to_string()); && let Some(relative_str) = relative_path.to_str()
} {
libraries.push(relative_str.to_string());
} }
}
} else if file_type.is_dir() { } else if file_type.is_dir() {
collect_dylibs(&path, bundle_root, libraries)?; collect_dylibs(&path, bundle_root, libraries)?;
} }

View File

@@ -110,10 +110,11 @@ impl CertificateIdentity {
{ {
if let Ok(x509_cert) = X509::from_der(&cert.cert_content) if let Ok(x509_cert) = X509::from_der(&cert.cert_content)
&& let Ok(cert_public_key) = x509_cert.public_key() && let Ok(cert_public_key) = x509_cert.public_key()
&& let Ok(cert_public_key_der) = cert_public_key.public_key_to_der() && let Ok(cert_public_key_der) = cert_public_key.public_key_to_der()
&& cert_public_key_der == our_public_key { && cert_public_key_der == our_public_key
return Ok(x509_cert); {
} return Ok(x509_cert);
}
} }
Err(Error::Certificate( Err(Error::Certificate(
"No matching certificate found".to_string(), "No matching certificate found".to_string(),
@@ -213,4 +214,31 @@ impl CertificateIdentity {
pub fn get_private_key_file_path(&self) -> &Path { pub fn get_private_key_file_path(&self) -> &Path {
&self.key_file &self.key_file
} }
pub fn get_serial_number(&self) -> Result<String, Error> {
let cert = match &self.certificate {
Some(c) => c,
None => {
return Err(Error::Certificate(
"No certificate available to get serial number".to_string(),
));
}
};
let num = cert
.serial_number()
.to_bn()
.map_err(|e| {
Error::Certificate(format!("Failed to convert serial number to bn: {}", e))
})?
.to_hex_str()
.map_err(|e| {
Error::Certificate(format!(
"Failed to convert serial number to hex string: {}",
e
))
})?
.to_string();
Ok(num.trim_start_matches("0").to_string())
}
} }

View File

@@ -83,10 +83,7 @@ fn afc_upload_dir<'a>(
.write_entire(&bytes) .write_entire(&bytes)
.await .await
.map_err(Error::IdeviceError)?; .map_err(Error::IdeviceError)?;
file_handle file_handle.close().await.map_err(Error::IdeviceError)?;
.close()
.await
.map_err(Error::IdeviceError)?;
} }
} }
Ok(()) Ok(())

View File

@@ -385,37 +385,10 @@ pub async fn sideload_app(
} }
if config.revoke_cert { if config.revoke_cert {
if let Some(cert) = cert.certificate { dev_session
dev_session .revoke_development_cert(DeveloperDeviceType::Ios, &team, &cert.get_serial_number()?)
.revoke_development_cert( .await?;
DeveloperDeviceType::Ios, logger.log("Certificate revoked");
&team,
cert.serial_number()
.to_bn()
.map_err(|e| {
Error::Certificate(format!(
"Failed to convert serial number to bn: {}",
e
))
})?
.to_hex_str()
.map_err(|e| {
Error::Certificate(format!(
"Failed to convert serial number to hex string: {}",
e
))
})?
.to_string()
.as_str(),
)
.await?;
logger.log("Certificate revoked");
} else {
return error_and_return(
logger,
Error::Certificate("No certificate to revoke".to_string()),
);
}
} }
Ok(()) Ok(())