in Lib/Collectors/FileSystemUtils.cs [211:281]
public static MacSignature? GetMacSignature(string? Path)
{
try
{
if (ExternalCommandRunner.RunExternalCommand("codesign", $"-dv --verbose=4 \"{Path}\"", out string stdOut, out string stdErr) == 0)
{
// The output from codesign goes to stdErr
var splits = stdErr.Split('\n');
if (splits[0].EndsWith("code object is not signed at all"))
{
return null;
}
var signature = new MacSignature();
foreach (var split in splits)
{
var innerSplit = split.Split('=');
switch (innerSplit[0])
{
case "Hash Type":
signature.HashType = innerSplit[1].Split(' ')[0];
break;
case "Hash Choices":
signature.HashChoices = innerSplit[1];
break;
case "CMSDigest":
signature.CMSDigest = innerSplit[1];
break;
case "Authority":
if (signature.Authorities is null)
{
signature.Authorities = new List<string>();
}
signature.Authorities.Add(innerSplit[1]);
break;
case "Timestamp":
if (DateTime.TryParse(innerSplit[1], out DateTime result))
{
signature.Timestamp = result;
}
break;
case "TeamIdentifier":
signature.TeamIdentifier = innerSplit[1];
break;
default:
if (innerSplit[0].StartsWith("CandidateCDHashFull"))
{
signature.CandidateCDHashFull = innerSplit[1];
}
break;
}
}
return signature;
}
}
catch (Exception e)
{
Log.Verbose("Failed to get Mac CodeSign information for {0} ({1}:{2})", Path, e.GetType(), e.Message);
}
return null;
}