in net/JetBrains.SignatureExtractor/src/SignatureOperations.cs [75:115]
public static async Task ApplySignature(Stream inputFile, Stream signatureFile, Stream outputStream, bool verifyResults)
{
if (!inputFile.CanSeek)
throw new SignatureApplicationException("Input file must be seekable");
if (verifyResults && !outputStream.CanSeek)
throw new SignatureApplicationException("Output file must be seekable if results verification is enabled");
var settings = new JsonSerializerSettings
{
ContractResolver = new SignatureContainerContractResolver()
};
SignatureContainer? signatureContainer = null;
using (StreamReader reader = new StreamReader(signatureFile))
using (JsonTextReader jsonReader = new JsonTextReader(reader))
{
JsonSerializer ser = JsonSerializer.Create(settings);
signatureContainer = ser.Deserialize<SignatureContainer>(jsonReader);
}
if (signatureContainer == null)
throw new SignatureApplicationException("Failed to deserialize signature");
var fileType = FileTypeExplorer.Detect(inputFile);
inputFile.Seek(0, SeekOrigin.Begin);
if (fileType.FileType != signatureContainer.FileType)
throw new SignatureApplicationException($"File type mismatch. Signature was extracted from {signatureContainer.FileType} file, but applied to {fileType.FileType} file.");
var verifyResult = fileType.FileType switch
{
FileType.MachO => await ApplyMachOSignature(inputFile, signatureContainer.MachOSignatureTransferData, outputStream, verifyResults),
FileType.Pe => await ApplyPeSignature(inputFile, signatureContainer.PeSignatureTransferData, outputStream, verifyResults),
FileType.Dmg => await ApplyDmgSignature(inputFile, signatureContainer.DmgSignatureTransferData, outputStream, verifyResults),
_ => throw new SignatureApplicationException($"Unsupported file type: {fileType.FileType}.")
};
if (verifyResult != null && !verifyResult.IsValid)
throw new SignatureApplicationException(verifyResult.Message);
}