public static async Task ApplySignature()

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);
  }