From bad9cc5e0c5795f4f7793f16a1c4c94cf2fd5e5c Mon Sep 17 00:00:00 2001 From: Patrick Ammann Date: Thu, 2 Jun 2022 09:48:04 +0200 Subject: [PATCH 1/4] feat: allow to set AcroForm --- PdfSharpCore/Pdf.Advanced/PdfCatalog.cs | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/PdfSharpCore/Pdf.Advanced/PdfCatalog.cs b/PdfSharpCore/Pdf.Advanced/PdfCatalog.cs index b34c661d..ab489c62 100644 --- a/PdfSharpCore/Pdf.Advanced/PdfCatalog.cs +++ b/PdfSharpCore/Pdf.Advanced/PdfCatalog.cs @@ -160,14 +160,15 @@ internal PdfOutlineCollection Outlines /// public PdfAcroForm AcroForm { - get + get { return (PdfAcroForm)Elements.GetValue(Keys.AcroForm); } + set { - if (_acroForm == null) - _acroForm = (PdfAcroForm)Elements.GetValue(Keys.AcroForm); - return _acroForm; + if (Elements.ContainsKey(Keys.AcroForm)) + Elements[Keys.AcroForm] = value; + else + Elements.Add(Keys.AcroForm, value); } } - PdfAcroForm _acroForm; /// /// Gets or sets the language identifier specifying the natural language for all text in the document. From 30e816a893fed91e7c1c3980068357e54a6fff62 Mon Sep 17 00:00:00 2001 From: Patrick Ammann Date: Tue, 31 May 2022 08:22:43 +0200 Subject: [PATCH 2/4] feat: support of digital signatures --- PdfSharpCore/Pdf.AcroForms/PdfAcroField.cs | 26 ++- .../Pdf.AcroForms/PdfSignatureField.cs | 147 ++++++++++++++- PdfSharpCore/Pdf.Advanced/PdfContents.cs | 2 +- PdfSharpCore/Pdf.Advanced/PdfInternals.cs | 2 +- PdfSharpCore/Pdf.IO/PdfWriter.cs | 2 +- PdfSharpCore/Pdf.Internal/PdfEncoders.cs | 11 +- .../DefaultAppearanceHandler.cs | 32 ++++ PdfSharpCore/Pdf.Signatures/DefaultSigner.cs | 47 +++++ .../ISignatureAppearanceHandler.cs | 9 + PdfSharpCore/Pdf.Signatures/ISigner.cs | 15 ++ .../Pdf.Signatures/PdfSignatureHandler.cs | 138 ++++++++++++++ .../Pdf.Signatures/PdfSignatureOptions.cs | 16 ++ .../Pdf.Signatures/PositionTracker.cs | 18 ++ PdfSharpCore/Pdf.Signatures/RangedStream.cs | 173 ++++++++++++++++++ PdfSharpCore/Pdf/PdfArray.cs | 27 ++- PdfSharpCore/Pdf/PdfDictionary.cs | 4 +- PdfSharpCore/Pdf/PdfDocument.cs | 16 +- PdfSharpCore/Pdf/PdfItem.cs | 16 ++ PdfSharpCore/Pdf/PdfString.cs | 7 +- PdfSharpCore/PdfSharpCore.csproj | 1 + 20 files changed, 684 insertions(+), 25 deletions(-) create mode 100644 PdfSharpCore/Pdf.Signatures/DefaultAppearanceHandler.cs create mode 100644 PdfSharpCore/Pdf.Signatures/DefaultSigner.cs create mode 100644 PdfSharpCore/Pdf.Signatures/ISignatureAppearanceHandler.cs create mode 100644 PdfSharpCore/Pdf.Signatures/ISigner.cs create mode 100644 PdfSharpCore/Pdf.Signatures/PdfSignatureHandler.cs create mode 100644 PdfSharpCore/Pdf.Signatures/PdfSignatureOptions.cs create mode 100644 PdfSharpCore/Pdf.Signatures/PositionTracker.cs create mode 100644 PdfSharpCore/Pdf.Signatures/RangedStream.cs diff --git a/PdfSharpCore/Pdf.AcroForms/PdfAcroField.cs b/PdfSharpCore/Pdf.AcroForms/PdfAcroField.cs index 522415dd..ba6ae08c 100644 --- a/PdfSharpCore/Pdf.AcroForms/PdfAcroField.cs +++ b/PdfSharpCore/Pdf.AcroForms/PdfAcroField.cs @@ -300,6 +300,10 @@ public sealed class PdfAcroFieldCollection : PdfArray : base(array) { } + PdfAcroFieldCollection(PdfDocument document) + : base(document) + { } + /// /// Gets the names of all fields in the collection. /// @@ -553,7 +557,27 @@ public class Keys : KeysBase [KeyInfo(KeyType.Integer | KeyType.Optional)] public const string Q = "/Q"; - // ReSharper restore InconsistentNaming + /// + /// (Optional) The type of PDF object that this dictionary describes; if present, + /// must be Sig for a signature dictionary. + /// + [KeyInfo(KeyType.Name | KeyType.Optional)] + public const string Type = "/Type"; + + /// + /// + /// + [KeyInfo(KeyType.Name | KeyType.Required)] + public const string Subtype = "/Subtype"; + + /// + /// + /// + [KeyInfo(KeyType.Rectangle | KeyType.Required)] + public const string Rect = "/Rect"; + + [KeyInfo(KeyType.Rectangle | KeyType.Required)] + public const string P = "/P"; } } } diff --git a/PdfSharpCore/Pdf.AcroForms/PdfSignatureField.cs b/PdfSharpCore/Pdf.AcroForms/PdfSignatureField.cs index b7f6a87a..3c562253 100644 --- a/PdfSharpCore/Pdf.AcroForms/PdfSignatureField.cs +++ b/PdfSharpCore/Pdf.AcroForms/PdfSignatureField.cs @@ -27,6 +27,11 @@ // DEALINGS IN THE SOFTWARE. #endregion +using PdfSharpCore.Drawing; +using PdfSharpCore.Pdf.Annotations; +using PdfSharpCore.Pdf.Signatures; +using System; + namespace PdfSharpCore.Pdf.AcroForms { /// @@ -34,29 +39,145 @@ namespace PdfSharpCore.Pdf.AcroForms /// public sealed class PdfSignatureField : PdfAcroField { + private bool visible; + + public string Reason + { + get + { + return Elements.GetDictionary(Keys.V).Elements.GetString(Keys.Reason); + } + set + { + Elements.GetDictionary(Keys.V).Elements[Keys.Reason] = new PdfString(value); + } + } + + public string Location + { + get + { + return Elements.GetDictionary(Keys.V).Elements.GetString(Keys.Location); + } + set + { + Elements.GetDictionary(Keys.V).Elements[Keys.Location] = new PdfString(value); + } + } + + public PdfItem Contents + { + get + { + return Elements.GetDictionary(Keys.V).Elements[Keys.Contents]; + } + set + { + Elements.GetDictionary(Keys.V).Elements.Add(Keys.Contents, value); + } + } + + + public PdfItem ByteRange + { + get + { + return Elements.GetDictionary(Keys.V).Elements[Keys.ByteRange]; + } + set + { + Elements.GetDictionary(Keys.V).Elements.Add(Keys.ByteRange, value); + } + } + + + public PdfRectangle Rectangle + { + get + { + return (PdfRectangle)Elements[Keys.Rect]; + } + set + { + Elements.Add(Keys.Rect, value); + this.visible = !(value.X1 + value.X2 + value.Y1 + value.Y2 == 0); + + } + } + + + public ISignatureAppearanceHandler AppearanceHandler { get; internal set; } + /// /// Initializes a new instance of PdfSignatureField. /// - internal PdfSignatureField(PdfDocument document) - : base(document) - { } + internal PdfSignatureField(PdfDocument document) : base(document) + { + + + Elements.Add(Keys.FT, new PdfName("/Sig")); + Elements.Add(Keys.T, new PdfString("Signature1")); + Elements.Add(Keys.Ff, new PdfInteger(132)); + Elements.Add(Keys.DR, new PdfDictionary()); + Elements.Add(Keys.Type, new PdfName("/Annot")); + Elements.Add(Keys.Subtype, new PdfName("/Widget")); + Elements.Add(Keys.P, document.Pages[0]); + + + PdfDictionary sign = new PdfDictionary(document); + sign.Elements.Add(Keys.Type, new PdfName("/Sig")); + sign.Elements.Add(Keys.Filter, new PdfName("/Adobe.PPKLite")); + sign.Elements.Add(Keys.SubFilter, new PdfName("/adbe.pkcs7.detached")); + sign.Elements.Add(Keys.M, new PdfDate(DateTime.Now)); + + document._irefTable.Add(sign); + document._irefTable.Add(this); + + Elements.Add(Keys.V, sign); + + } internal PdfSignatureField(PdfDictionary dict) : base(dict) { } + + internal override void PrepareForSave() + { + if (!this.visible) + return; + + if (this.AppearanceHandler == null) + throw new Exception("AppearanceHandler is null"); + + + + PdfRectangle rect = Elements.GetRectangle(PdfAnnotation.Keys.Rect); + XForm form = new XForm(this._document, rect.Size); + XGraphics gfx = XGraphics.FromForm(form); + + this.AppearanceHandler.DrawAppearance(gfx, rect.ToXRect()); + + form.DrawingFinished(); + + // Get existing or create new appearance dictionary + PdfDictionary ap = Elements[PdfAnnotation.Keys.AP] as PdfDictionary; + if (ap == null) + { + ap = new PdfDictionary(this._document); + Elements[PdfAnnotation.Keys.AP] = ap; + } + + // Set XRef to normal state + ap.Elements["/N"] = form.PdfForm.Reference; + } + /// /// Predefined keys of this dictionary. /// The description comes from PDF 1.4 Reference. /// public new class Keys : PdfAcroField.Keys - { - /// - /// (Optional) The type of PDF object that this dictionary describes; if present, - /// must be Sig for a signature dictionary. - /// - [KeyInfo(KeyType.Name | KeyType.Optional)] - public const string Type = "/Type"; + { /// /// (Required; inheritable) The name of the signature handler to be used for @@ -113,6 +234,12 @@ internal PdfSignatureField(PdfDictionary dict) [KeyInfo(KeyType.TextString | KeyType.Optional)] public const string Reason = "/Reason"; + /// + /// (Optional) + /// + [KeyInfo(KeyType.TextString | KeyType.Optional)] + public const string ContactInfo = "/ContactInfo"; + /// /// Gets the KeysMeta for these keys. /// diff --git a/PdfSharpCore/Pdf.Advanced/PdfContents.cs b/PdfSharpCore/Pdf.Advanced/PdfContents.cs index c1941109..0d4ffe7d 100644 --- a/PdfSharpCore/Pdf.Advanced/PdfContents.cs +++ b/PdfSharpCore/Pdf.Advanced/PdfContents.cs @@ -200,7 +200,7 @@ internal override void WriteObject(PdfWriter writer) { // Save two bytes in PDF stream... if (Elements.Count == 1) - Elements[0].WriteObject(writer); + Elements[0].Write(writer); else base.WriteObject(writer); } diff --git a/PdfSharpCore/Pdf.Advanced/PdfInternals.cs b/PdfSharpCore/Pdf.Advanced/PdfInternals.cs index b921ccbd..a4a43157 100644 --- a/PdfSharpCore/Pdf.Advanced/PdfInternals.cs +++ b/PdfSharpCore/Pdf.Advanced/PdfInternals.cs @@ -268,7 +268,7 @@ public void WriteObject(Stream stream, PdfItem item) // Never write an encrypted object PdfWriter writer = new PdfWriter(stream, null); writer.Options = PdfWriterOptions.OmitStream; - item.WriteObject(writer); + item.Write(writer); } /// diff --git a/PdfSharpCore/Pdf.IO/PdfWriter.cs b/PdfSharpCore/Pdf.IO/PdfWriter.cs index bec19e4d..e397af95 100644 --- a/PdfSharpCore/Pdf.IO/PdfWriter.cs +++ b/PdfSharpCore/Pdf.IO/PdfWriter.cs @@ -199,7 +199,7 @@ public void Write(PdfString value) PdfStringEncoding encoding = (PdfStringEncoding)(value.Flags & PdfStringFlags.EncodingMask); string pdf = (value.Flags & PdfStringFlags.HexLiteral) == 0 ? PdfEncoders.ToStringLiteral(value.Value, encoding, SecurityHandler) : - PdfEncoders.ToHexStringLiteral(value.Value, encoding, SecurityHandler); + PdfEncoders.ToHexStringLiteral(value.Value, encoding, SecurityHandler, value.PaddingLeft); WriteRaw(pdf); _lastCat = CharCat.Delimiter; diff --git a/PdfSharpCore/Pdf.Internal/PdfEncoders.cs b/PdfSharpCore/Pdf.Internal/PdfEncoders.cs index 7c050919..bd7d2b97 100644 --- a/PdfSharpCore/Pdf.Internal/PdfEncoders.cs +++ b/PdfSharpCore/Pdf.Internal/PdfEncoders.cs @@ -245,9 +245,9 @@ public static string ToStringLiteral(byte[] bytes, bool unicode, PdfStandardSecu /// /// Converts a raw string into a raw hexadecimal string literal, possibly encrypted. /// - public static string ToHexStringLiteral(string text, PdfStringEncoding encoding, PdfStandardSecurityHandler securityHandler) + public static string ToHexStringLiteral(string text, PdfStringEncoding encoding, PdfStandardSecurityHandler securityHandler, int paddingLeft) { - if (String.IsNullOrEmpty(text)) + if (String.IsNullOrEmpty(text) && paddingLeft == 0) return "<>"; byte[] bytes; @@ -274,6 +274,13 @@ public static string ToHexStringLiteral(string text, PdfStringEncoding encoding, throw new NotImplementedException(encoding.ToString()); } + if (bytes.Length < paddingLeft) + { + byte[] tmp = new byte[paddingLeft]; + Array.Copy(bytes, tmp, bytes.Length); + bytes = tmp; + } + byte[] agTemp = FormatStringLiteral(bytes, encoding == PdfStringEncoding.Unicode, true, true, securityHandler); return RawEncoding.GetString(agTemp, 0, agTemp.Length); } diff --git a/PdfSharpCore/Pdf.Signatures/DefaultAppearanceHandler.cs b/PdfSharpCore/Pdf.Signatures/DefaultAppearanceHandler.cs new file mode 100644 index 00000000..e700ee7c --- /dev/null +++ b/PdfSharpCore/Pdf.Signatures/DefaultAppearanceHandler.cs @@ -0,0 +1,32 @@ +using System; +using PdfSharpCore.Drawing; +using PdfSharpCore.Drawing.Layout; + +namespace PdfSharpCore.Pdf.Signatures +{ + internal class DefaultAppearanceHandler : ISignatureAppearanceHandler + { + public string Location { get; set; } + public string Reason { get; set; } + public string Signer { get; set; } + + + public void DrawAppearance(XGraphics gfx, XRect rect) + { + var backColor = XColor.Empty; + var defaultText = string.Format("Signed by: {0}\nLocation: {1}\nReason: {2}\nDate: {3}", Signer, Location, Reason, DateTime.Now); + + XFont font = new XFont("Verdana", 7, XFontStyle.Regular); + + XTextFormatter txtFormat = new XTextFormatter(gfx); + + var currentPosition = new XPoint(0, 0); + + txtFormat.DrawString(defaultText, + font, + new XSolidBrush(XColor.FromKnownColor(XKnownColor.Black)), + new XRect(currentPosition.X, currentPosition.Y, rect.Width - currentPosition.X, rect.Height), + XStringFormats.TopLeft); + } + } +} diff --git a/PdfSharpCore/Pdf.Signatures/DefaultSigner.cs b/PdfSharpCore/Pdf.Signatures/DefaultSigner.cs new file mode 100644 index 00000000..920ac48b --- /dev/null +++ b/PdfSharpCore/Pdf.Signatures/DefaultSigner.cs @@ -0,0 +1,47 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Security.Cryptography.Pkcs; +using System.Security.Cryptography.X509Certificates; +using System.Text; + +namespace PdfSharpCore.Pdf.Signatures +{ + public class DefaultSigner : ISigner + { + public X509Certificate2 Certificate { get; private set; } + + public DefaultSigner(X509Certificate2 Certificate) + { + this.Certificate = Certificate; + } + + public byte[] GetSignedCms(Stream stream) + { + var range = new byte[stream.Length]; + + stream.Position = 0; + stream.Read(range, 0, range.Length); + + + + var contentInfo = new ContentInfo(range); + + SignedCms signedCms = new SignedCms(contentInfo, true); + CmsSigner signer = new CmsSigner(Certificate); + signer.UnsignedAttributes.Add(new Pkcs9SigningTime()); + + signedCms.ComputeSignature(signer, true); + var bytes = signedCms.Encode(); + + return bytes; + } + + + + public string GetName() + { + return Certificate.GetNameInfo(X509NameType.SimpleName, false); + } + } +} diff --git a/PdfSharpCore/Pdf.Signatures/ISignatureAppearanceHandler.cs b/PdfSharpCore/Pdf.Signatures/ISignatureAppearanceHandler.cs new file mode 100644 index 00000000..2bdb99c8 --- /dev/null +++ b/PdfSharpCore/Pdf.Signatures/ISignatureAppearanceHandler.cs @@ -0,0 +1,9 @@ +using PdfSharpCore.Drawing; + +namespace PdfSharpCore.Pdf.Signatures +{ + public interface ISignatureAppearanceHandler + { + void DrawAppearance(XGraphics gfx, XRect rect); + } +} diff --git a/PdfSharpCore/Pdf.Signatures/ISigner.cs b/PdfSharpCore/Pdf.Signatures/ISigner.cs new file mode 100644 index 00000000..8885be23 --- /dev/null +++ b/PdfSharpCore/Pdf.Signatures/ISigner.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; + +namespace PdfSharpCore.Pdf.Signatures +{ + public interface ISigner + { + byte[] GetSignedCms(Stream stream); + + string GetName(); + + } +} diff --git a/PdfSharpCore/Pdf.Signatures/PdfSignatureHandler.cs b/PdfSharpCore/Pdf.Signatures/PdfSignatureHandler.cs new file mode 100644 index 00000000..03bdd1a1 --- /dev/null +++ b/PdfSharpCore/Pdf.Signatures/PdfSignatureHandler.cs @@ -0,0 +1,138 @@ +using PdfSharpCore.Pdf; +using PdfSharpCore.Pdf.AcroForms; +using PdfSharpCore.Pdf.Advanced; +using PdfSharpCore.Pdf.Annotations; +using PdfSharpCore.Pdf.Signatures; +using System; +using System.Collections.Generic; +using System.IO; +using System.Security.Cryptography.Pkcs; +using System.Security.Cryptography.X509Certificates; +using System.Text; +using static PdfSharpCore.Pdf.AcroForms.PdfAcroField; + +namespace PdfSharpCore.Pdf.Signatures +{ + public class IntEventArgs : EventArgs { public int Value { get; set; } } + + /// + /// Handles the signature + /// + public class PdfSignatureHandler + { + + private PositionTracker contentsTraker; + private PositionTracker rangeTracker; + private int? maximumSignatureLength; + private const int byteRangePaddingLength = 36; // the place big enough required to replace [0 0 0 0] with the correct value + + public event EventHandler SignatureSizeComputed = (s, e) => { }; + + public PdfDocument Document { get; private set; } + public PdfSignatureOptions Options { get; private set; } + private ISigner signer { get; set; } + + public void AttachToDocument(PdfDocument documentToSign) + { + this.Document = documentToSign; + this.Document.BeforeSave += AddSignatureComponents; + this.Document.AfterSave += ComputeSignatureAndRange; + + if (!maximumSignatureLength.HasValue) + { + maximumSignatureLength = signer.GetSignedCms(new MemoryStream(new byte[] { 0})).Length; + SignatureSizeComputed(this, new IntEventArgs() { Value = maximumSignatureLength.Value }); + } + } + + public PdfSignatureHandler(ISigner signer, int? signatureMaximumLength, PdfSignatureOptions options) + { + this.signer = signer; + + + this.maximumSignatureLength = signatureMaximumLength; + this.Options = options; + } + + private void ComputeSignatureAndRange(object sender, PdfDocumentEventArgs e) + { + var writer = e.Writer; + writer.Stream.Position = rangeTracker.Start; + var rangeArray = new PdfArray(new PdfInteger(0), + new PdfInteger((int)contentsTraker.Start), + new PdfInteger((int)contentsTraker.End), + new PdfInteger((int)(writer.Stream.Length - contentsTraker.End))); + rangeArray.Write(writer); + + var rangeToSign = GetRangeToSign(writer.Stream); + + var signature = signer.GetSignedCms(rangeToSign); + if (signature.Length > maximumSignatureLength) + throw new Exception("The signature length is bigger that the approximation made."); + + var hexFormated = Encoding.Default.GetBytes(FormatHex(signature)); + + writer.Stream.Position = contentsTraker.Start+1; + writer.Write(hexFormated); + } + + string FormatHex(byte[] bytes) + { + var retval = new StringBuilder(); + + for (int idx = 0; idx < bytes.Length; idx++) + retval.AppendFormat("{0:x2}", bytes[idx]); + + return retval.ToString(); + } + + private RangedStream GetRangeToSign(Stream stream) + { + return new RangedStream(stream, new List() + { + new RangedStream.Range(0, contentsTraker.Start), + new RangedStream.Range(contentsTraker.End, stream.Length - contentsTraker.End) + }); + + } + + private void AddSignatureComponents(object sender, EventArgs e) + { + var catalog = Document.Catalog; + + if (catalog.AcroForm == null) + catalog.AcroForm = new PdfAcroForm(Document); + + catalog.AcroForm.Elements.Add(PdfAcroForm.Keys.SigFlags, new PdfInteger(3)); + + var signature = new PdfSignatureField(Document); + + var paddedContents = new PdfString("", PdfStringFlags.HexLiteral, maximumSignatureLength.Value); + var paddedRange = new PdfArray(Document, byteRangePaddingLength, new PdfInteger(0), new PdfInteger(0), new PdfInteger(0), new PdfInteger(0)); + + signature.Contents = paddedContents; + signature.ByteRange = paddedRange; + signature.Reason = Options.Reason; + signature.Location = Options.Location; + signature.Rectangle = new PdfRectangle(Options.Rectangle); + signature.AppearanceHandler = Options.AppearanceHandler ?? new DefaultAppearanceHandler() + { + Location = Options.Location, + Reason = Options.Reason, + Signer = signer.GetName() + }; + signature.PrepareForSave(); + + this.contentsTraker = new PositionTracker(paddedContents); + this.rangeTracker = new PositionTracker(paddedRange); + + if (!Document.Pages[0].Elements.ContainsKey(PdfPage.Keys.Annots)) + Document.Pages[0].Elements.Add(PdfPage.Keys.Annots, new PdfArray(Document)); + + (Document.Pages[0].Elements[PdfPage.Keys.Annots] as PdfArray).Elements.Add(signature); + + catalog.AcroForm.Fields.Elements.Add(signature); + + } + } +} diff --git a/PdfSharpCore/Pdf.Signatures/PdfSignatureOptions.cs b/PdfSharpCore/Pdf.Signatures/PdfSignatureOptions.cs new file mode 100644 index 00000000..7333ba48 --- /dev/null +++ b/PdfSharpCore/Pdf.Signatures/PdfSignatureOptions.cs @@ -0,0 +1,16 @@ +using PdfSharpCore.Drawing; +using System; +using System.Collections.Generic; +using System.Text; + +namespace PdfSharpCore.Pdf.Signatures +{ + public class PdfSignatureOptions + { + public ISignatureAppearanceHandler AppearanceHandler { get; set; } + public string ContactInfo { get; set; } + public string Location { get; set; } + public string Reason { get; set; } + public XRect Rectangle { get; set; } + } +} diff --git a/PdfSharpCore/Pdf.Signatures/PositionTracker.cs b/PdfSharpCore/Pdf.Signatures/PositionTracker.cs new file mode 100644 index 00000000..dd2406fe --- /dev/null +++ b/PdfSharpCore/Pdf.Signatures/PositionTracker.cs @@ -0,0 +1,18 @@ +namespace PdfSharpCore.Pdf.Signatures +{ + internal class PositionTracker + { + public PdfItem Item { get; private set; } + public long Start { get; private set; } + public long End { get; private set; } + + public PositionTracker(PdfItem item) + { + Item = item; + Item.BeforeWrite += (s, e) => + this.Start = e.Position; + Item.AfterWrite += (s, e) => + this.End = e.Position; + } + } +} diff --git a/PdfSharpCore/Pdf.Signatures/RangedStream.cs b/PdfSharpCore/Pdf.Signatures/RangedStream.cs new file mode 100644 index 00000000..9000f419 --- /dev/null +++ b/PdfSharpCore/Pdf.Signatures/RangedStream.cs @@ -0,0 +1,173 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; + +namespace PdfSharpCore.Pdf.Signatures +{ + public class RangedStream : Stream + { + private Range[] ranges; + + public class Range + { + + public Range(long offset, long length) + { + this.Offset = offset; + this.Length = length; + } + public long Offset { get; set; } + public long Length { get; set; } + } + + private Stream stream { get; set; } + + + public RangedStream(Stream originalStrem, List ranges) + { + this.stream = originalStrem; + + long previousPosition = 0; + + this.ranges = ranges.OrderBy(item => item.Offset).ToArray(); + foreach (var range in ranges) + { + if (range.Offset < previousPosition) + throw new Exception("Ranges are not continuous"); + previousPosition = range.Offset + range.Length ; + } + } + + + public override bool CanRead + { + get + { + throw new NotImplementedException(); + } + } + + public override bool CanSeek + { + get + { + throw new NotImplementedException(); + } + } + + public override bool CanWrite + { + get + { + return false; + } + } + + public override long Length + { + get + { + return ranges.Sum(item => item.Length); + } + } + + + private IEnumerable GetPreviousRanges(long position) + { + return ranges.Where(item => item.Offset < position && item.Offset + item.Length < position); + } + + private Range GetCurrentRange(long position) + { + return ranges.FirstOrDefault(item => item.Offset <= position && item.Offset + item.Length > position); + } + + + + public override long Position + { + get + { + return GetPreviousRanges(stream.Position).Sum(item => item.Length) + stream.Position - GetCurrentRange(stream.Position).Offset; + } + + set + { + Range currentRange = null; + List previousRanges = new List(); + long maxPosition = 0; + foreach (var range in ranges) + { + currentRange = range; + maxPosition += range.Length; + if (maxPosition > value) + break; + previousRanges.Add(range); + } + + long positionInCurrentRange = value - previousRanges.Sum(item => item.Length); + stream.Position = currentRange.Offset + positionInCurrentRange; + } + } + + + + public override void Flush() + { + throw new NotImplementedException(); + } + + public override int Read(byte[] buffer, int offset, int count) + { + + var length = stream.Length; + int retVal = 0; + for (int i = 0; i < count; i++) + { + + if (stream.Position == length) + { + break; + } + + PerformSkipIfNeeded(); + retVal += stream.Read(buffer, offset++, 1); + + } + + return retVal; + } + + + private void PerformSkipIfNeeded() + { + var currentRange = GetCurrentRange(stream.Position); + + if (currentRange == null) + stream.Position = GetNextRange().Offset; + } + + private Range GetNextRange() + { + return ranges.OrderBy(item => item.Offset).First(item => item.Offset > stream.Position); + } + + + public override long Seek(long offset, SeekOrigin origin) + { + throw new NotImplementedException(); + } + + public override void SetLength(long value) + { + throw new NotImplementedException(); + } + + public override void Write(byte[] buffer, int offset, int count) + { + throw new NotImplementedException(); + } + } +} diff --git a/PdfSharpCore/Pdf/PdfArray.cs b/PdfSharpCore/Pdf/PdfArray.cs index 0b43ce0c..23d21018 100644 --- a/PdfSharpCore/Pdf/PdfArray.cs +++ b/PdfSharpCore/Pdf/PdfArray.cs @@ -1,4 +1,4 @@ -#region PDFsharp - A .NET library for processing PDF +#region PDFsharp - A .NET library for processing PDF // // Authors: // Stefan Lange @@ -70,6 +70,19 @@ public PdfArray(PdfDocument document, params PdfItem[] items) Elements.Add(item); } + + public PdfArray(params PdfItem[] items) + { + foreach (PdfItem item in items) + Elements.Add(item); + } + + public PdfArray(PdfDocument document, int paddingRight, params PdfItem[] items) + : this(document, items) + { + this.PaddingRight = paddingRight; + } + /// /// Initializes a new instance from an existing dictionary. Used for object type transformation. /// @@ -118,6 +131,8 @@ public ArrayElements Elements get { return _elements ?? (_elements = new ArrayElements(this)); } } + public int PaddingRight { get; private set; } + /// /// Returns an enumerator that iterates through a collection. /// @@ -152,9 +167,17 @@ internal override void WriteObject(PdfWriter writer) for (int idx = 0; idx < count; idx++) { PdfItem value = Elements[idx]; - value.WriteObject(writer); + value.Write(writer); } writer.WriteEndObject(); + if (PaddingRight > 0) + { + var bytes = new byte[PaddingRight]; + for (int i = 0; i < PaddingRight; i++) + bytes[i] = 32; + + writer.Write(bytes); + } } /// diff --git a/PdfSharpCore/Pdf/PdfDictionary.cs b/PdfSharpCore/Pdf/PdfDictionary.cs index 4391e1ff..35fcc159 100644 --- a/PdfSharpCore/Pdf/PdfDictionary.cs +++ b/PdfSharpCore/Pdf/PdfDictionary.cs @@ -234,8 +234,8 @@ internal virtual void WriteDictionaryElement(PdfWriter writer, PdfName key) Debug.Assert(false, "Check when we come here."); } #endif - key.WriteObject(writer); - item.WriteObject(writer); + key.Write(writer); + item.Write(writer); writer.NewLine(); } diff --git a/PdfSharpCore/Pdf/PdfDocument.cs b/PdfSharpCore/Pdf/PdfDocument.cs index b7a355b8..0c3a72cd 100644 --- a/PdfSharpCore/Pdf/PdfDocument.cs +++ b/PdfSharpCore/Pdf/PdfDocument.cs @@ -40,12 +40,19 @@ namespace PdfSharpCore.Pdf { + internal class PdfDocumentEventArgs : EventArgs + { + public PdfWriter Writer { get; set; } + } + /// /// Represents a PDF document. /// [DebuggerDisplay("(Name={Name})")] // A name makes debugging easier public sealed class PdfDocument : PdfObject, IDisposable { + internal event EventHandler BeforeSave = (s, e) => { }; + internal event EventHandler AfterSave = (s, e) => { }; internal DocumentState _state; internal PdfDocumentOpenMode _openMode; @@ -245,7 +252,7 @@ public void Save(string path) throw new InvalidOperationException(PSSR.CannotModify); - using (Stream stream = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.None)) + using (Stream stream = new FileStream(path, FileMode.Create, FileAccess.ReadWrite, FileShare.None)) { Save(stream); } @@ -304,6 +311,8 @@ public void Save(Stream stream) /// void DoSave(PdfWriter writer) { + this.BeforeSave(this, EventArgs.Empty); + if (_pages == null || _pages.Count == 0) { if (_outStream != null) @@ -354,13 +363,13 @@ void DoSave(PdfWriter writer) GetType(); #endif iref.Position = writer.Position; - iref.Value.WriteObject(writer); + iref.Value.Write(writer); } var startxref = writer.Position; _irefTable.WriteObject(writer); writer.WriteRaw("trailer\n"); _trailer.Elements.SetInteger("/Size", count + 1); - _trailer.WriteObject(writer); + _trailer.Write(writer); writer.WriteEof(this, startxref); //if (encrypt) @@ -373,6 +382,7 @@ void DoSave(PdfWriter writer) { if (writer != null) { + this.AfterSave(this, new PdfDocumentEventArgs() { Writer = writer }); writer.Stream.Flush(); // DO NOT CLOSE WRITER HERE //writer.Close(); diff --git a/PdfSharpCore/Pdf/PdfItem.cs b/PdfSharpCore/Pdf/PdfItem.cs index 6abfb375..6385d6bb 100644 --- a/PdfSharpCore/Pdf/PdfItem.cs +++ b/PdfSharpCore/Pdf/PdfItem.cs @@ -32,12 +32,19 @@ namespace PdfSharpCore.Pdf { + public class PdfItemEventArgs : EventArgs + { + public long Position { get; set; } + } + /// /// The base class of all PDF objects and simple PDF types. /// public abstract class PdfItem : ICloneable { // All simple types (i.e. derived from PdfItem but not from PdfObject) must be immutable. + internal event EventHandler BeforeWrite; + internal event EventHandler AfterWrite; object ICloneable.Clone() { @@ -65,5 +72,14 @@ protected virtual object Copy() /// to the specified PdfWriter. /// internal abstract void WriteObject(PdfWriter writer); + + internal void Write(PdfWriter writer) + { + var startPosition = writer.Layout == PdfWriterLayout.Verbose ? writer.Position + 1 : writer.Position; + + this.BeforeWrite?.Invoke(this, new PdfItemEventArgs() { Position = startPosition }); + WriteObject(writer); + this.AfterWrite?.Invoke(this, new PdfItemEventArgs() { Position = writer.Position }); + } } } diff --git a/PdfSharpCore/Pdf/PdfString.cs b/PdfSharpCore/Pdf/PdfString.cs index 8d2cf1b0..dfb463de 100644 --- a/PdfSharpCore/Pdf/PdfString.cs +++ b/PdfSharpCore/Pdf/PdfString.cs @@ -166,10 +166,11 @@ public PdfString(string value, PdfStringEncoding encoding) _flags = (PdfStringFlags)encoding; } - internal PdfString(string value, PdfStringFlags flags) + internal PdfString(string value, PdfStringFlags flags, int paddingLeft = 0) { _value = value; _flags = flags; + this.PaddingLeft = paddingLeft; } /// @@ -223,6 +224,8 @@ internal byte[] EncryptionValue set { _value = PdfEncoders.RawEncoding.GetString(value, 0, value.Length); } } + public int PaddingLeft { get; private set; } + /// /// Returns the string. /// @@ -232,7 +235,7 @@ public override string ToString() PdfStringEncoding encoding = (PdfStringEncoding)(_flags & PdfStringFlags.EncodingMask); string pdf = (_flags & PdfStringFlags.HexLiteral) == 0 ? PdfEncoders.ToStringLiteral(_value, encoding, null) : - PdfEncoders.ToHexStringLiteral(_value, encoding, null); + PdfEncoders.ToHexStringLiteral(_value, encoding, null, PaddingLeft); return pdf; #else return _value; diff --git a/PdfSharpCore/PdfSharpCore.csproj b/PdfSharpCore/PdfSharpCore.csproj index 4a27a4c1..81d47d4d 100644 --- a/PdfSharpCore/PdfSharpCore.csproj +++ b/PdfSharpCore/PdfSharpCore.csproj @@ -40,6 +40,7 @@ PdfSharpCore is a partial port of PdfSharp.Xamarin for .NET Core Additionally Mi + From b3e115417785be2f84150b14b7210854b0767997 Mon Sep 17 00:00:00 2001 From: Patrick Ammann Date: Thu, 2 Jun 2022 09:47:39 +0200 Subject: [PATCH 3/4] feat: add test project (not for merge) --- PdfSharpCore.sln | 13 ++- SignatureTestConsole/Program.cs | 84 ++++++++++++++++++ .../SignatureTestConsole.csproj | 21 +++++ SignatureTestConsole/TestFiles/doc1.pdf | Bin 0 -> 12903 bytes SignatureTestConsole/TestFiles/logo.jpg | Bin 0 -> 66790 bytes 5 files changed, 116 insertions(+), 2 deletions(-) create mode 100644 SignatureTestConsole/Program.cs create mode 100644 SignatureTestConsole/SignatureTestConsole.csproj create mode 100644 SignatureTestConsole/TestFiles/doc1.pdf create mode 100644 SignatureTestConsole/TestFiles/logo.jpg diff --git a/PdfSharpCore.sln b/PdfSharpCore.sln index 4343b14f..26e461ed 100644 --- a/PdfSharpCore.sln +++ b/PdfSharpCore.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.29911.84 +# Visual Studio Version 17 +VisualStudioVersion = 17.2.32519.379 MinimumVisualStudioVersion = 10.0.40219.1 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PdfSharpCore", "PdfSharpCore\PdfSharpCore.csproj", "{4005DEBC-75F8-48DA-BBCC-353E17872B3E}" EndProject @@ -18,6 +18,11 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PdfSharpCore.Test", "PdfSharpCore.Test\PdfSharpCore.Test.csproj", "{A862C0CE-C095-459C-A32B-8FCDD15A93BF}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SignatureTestConsole", "SignatureTestConsole\SignatureTestConsole.csproj", "{272E99C1-3210-497B-8CCE-D561E353FC13}" + ProjectSection(ProjectDependencies) = postProject + {4005DEBC-75F8-48DA-BBCC-353E17872B3E} = {4005DEBC-75F8-48DA-BBCC-353E17872B3E} + EndProjectSection +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -44,6 +49,10 @@ Global {A862C0CE-C095-459C-A32B-8FCDD15A93BF}.Debug|Any CPU.Build.0 = Debug|Any CPU {A862C0CE-C095-459C-A32B-8FCDD15A93BF}.Release|Any CPU.ActiveCfg = Release|Any CPU {A862C0CE-C095-459C-A32B-8FCDD15A93BF}.Release|Any CPU.Build.0 = Release|Any CPU + {272E99C1-3210-497B-8CCE-D561E353FC13}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {272E99C1-3210-497B-8CCE-D561E353FC13}.Debug|Any CPU.Build.0 = Debug|Any CPU + {272E99C1-3210-497B-8CCE-D561E353FC13}.Release|Any CPU.ActiveCfg = Release|Any CPU + {272E99C1-3210-497B-8CCE-D561E353FC13}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/SignatureTestConsole/Program.cs b/SignatureTestConsole/Program.cs new file mode 100644 index 00000000..1ff85b28 --- /dev/null +++ b/SignatureTestConsole/Program.cs @@ -0,0 +1,84 @@ +using PdfSharpCore.Drawing; +using PdfSharpCore.Pdf; +using System.Security.Cryptography.X509Certificates; +using PdfSharpCore.Pdf.IO; +using PdfSharpCore.Drawing.Layout; +using PdfSharpCore.Pdf.Signatures; +using System; + +namespace TestConsole +{ + class Program + { + public static void Main(string[] args) + { + Program.CreateAndSign(); + Program.SignExisting(); + } + + private static void CreateAndSign() + { + string text = "CreateAndSign.pdf"; + XFont font = new XFont("Verdana", 10.0, XFontStyle.Regular); + PdfDocument pdfDocument = new PdfDocument(); + PdfPage pdfPage = pdfDocument.AddPage(); + XGraphics xGraphics = XGraphics.FromPdfPage(pdfPage); + XRect layoutRectangle = new XRect(0.0, 0.0, pdfPage.Width, pdfPage.Height); + xGraphics.DrawString("Sample document", font, XBrushes.Black, layoutRectangle, XStringFormats.TopCenter); + PdfSignatureOptions options = new PdfSignatureOptions + { + ContactInfo = "Contact Info", + Location = "Paris", + Reason = "Test signatures", + Rectangle = new XRect(36.0, 700.0, 200.0, 50.0) + }; + PdfSignatureHandler pdfSignatureHandler = new PdfSignatureHandler( new DefaultSigner(Program.GetCertificate()), null, options); + pdfSignatureHandler.AttachToDocument(pdfDocument); + pdfDocument.Save(text); + } + private static void SignExisting() + { + string text = string.Format("SignExisting.pdf", new object[0]); + PdfDocument pdfDocument = PdfReader.Open("TestFiles\\doc1.pdf"); + PdfSignatureOptions options = new PdfSignatureOptions + { + ContactInfo = "Contact Info", + Location = "Paris", + Reason = "Test signatures", + Rectangle = new XRect(36.0, 735.0, 200.0, 50.0), + AppearanceHandler = new Program.SignAppearenceHandler() + }; + + PdfSignatureHandler pdfSignatureHandler = new PdfSignatureHandler(new DefaultSigner(Program.GetCertificate()), null, options); + pdfSignatureHandler.AttachToDocument(pdfDocument); + pdfDocument.Save(text); + } + + private static X509Certificate2 GetCertificate() + { + // add yours here + return new X509Certificate2("TestFiles\\myself.pfx", "1234", X509KeyStorageFlags.Exportable); + } + + private class SignAppearenceHandler : ISignatureAppearanceHandler + { + private XImage Image = XImage.FromFile("TestFiles\\logo.jpg"); + public void DrawAppearance(XGraphics gfx, XRect rect) + { + XColor empty = XColor.Empty; + string text = "Signed by Napoleon \nLocation: Paris \nDate: " + DateTime.Now.ToString(); + XFont font = new XFont("Verdana", 7.0, XFontStyle.Regular); + XTextFormatter xTextFormatter = new XTextFormatter(gfx); + int num = this.Image.PixelWidth / this.Image.PixelHeight; + XPoint xPoint = new XPoint(0.0, 0.0); + bool flag = this.Image != null; + if (flag) + { + gfx.DrawImage(this.Image, xPoint.X, xPoint.Y, rect.Width / 4.0, rect.Width / 4.0 / (double)num); + xPoint = new XPoint(rect.Width / 4.0, 0.0); + } + xTextFormatter.DrawString(text, font, new XSolidBrush(XColor.FromKnownColor(XKnownColor.Black)), new XRect(xPoint.X, xPoint.Y, rect.Width - xPoint.X, rect.Height), XStringFormats.TopLeft); + } + } + } +} diff --git a/SignatureTestConsole/SignatureTestConsole.csproj b/SignatureTestConsole/SignatureTestConsole.csproj new file mode 100644 index 00000000..cdf8ea35 --- /dev/null +++ b/SignatureTestConsole/SignatureTestConsole.csproj @@ -0,0 +1,21 @@ + + + + Exe + netcoreapp3.1;net5.0;net6.0 + + + + + + + + + Always + + + Always + + + + diff --git a/SignatureTestConsole/TestFiles/doc1.pdf b/SignatureTestConsole/TestFiles/doc1.pdf new file mode 100644 index 0000000000000000000000000000000000000000..2838868eb497197d7123a7b06279f2a241c89563 GIT binary patch literal 12903 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 aeZOQKIGwdGn11x^ho*D1-QZOJbp01Eh@0;K literal 0 HcmV?d00001 From 7aebebb2df27ccd64f8ec51dde7ba4c25e9dc48a Mon Sep 17 00:00:00 2001 From: achi Date: Mon, 4 Dec 2023 11:17:42 +1000 Subject: [PATCH 4/4] fix signature --- .../MigraDocCore.DocumentObjectModel.csproj | 2 +- MigraDocCore.Rendering/MigraDocCore.Rendering.csproj | 2 +- PdfSharpCore.Charting/PdfSharpCore.Charting.csproj | 2 +- PdfSharpCore.Test/PdfSharpCore.Test.csproj | 2 +- PdfSharpCore/Pdf.IO/PdfWriter.cs | 4 ++-- PdfSharpCore/PdfSharpCore.csproj | 2 +- SignatureTestConsole/Program.cs | 2 +- SignatureTestConsole/SignatureTestConsole.csproj | 2 +- 8 files changed, 9 insertions(+), 9 deletions(-) diff --git a/MigraDocCore.DocumentObjectModel/MigraDocCore.DocumentObjectModel.csproj b/MigraDocCore.DocumentObjectModel/MigraDocCore.DocumentObjectModel.csproj index f3f17cc0..67ca5968 100644 --- a/MigraDocCore.DocumentObjectModel/MigraDocCore.DocumentObjectModel.csproj +++ b/MigraDocCore.DocumentObjectModel/MigraDocCore.DocumentObjectModel.csproj @@ -1,6 +1,6 @@  - netstandard2.0;netcoreapp3.1;net5.0;net6.0 + net7.0 false True Stefan Steiger and Contributors diff --git a/MigraDocCore.Rendering/MigraDocCore.Rendering.csproj b/MigraDocCore.Rendering/MigraDocCore.Rendering.csproj index 3666b526..86dfd66c 100644 --- a/MigraDocCore.Rendering/MigraDocCore.Rendering.csproj +++ b/MigraDocCore.Rendering/MigraDocCore.Rendering.csproj @@ -1,6 +1,6 @@  - netstandard2.0;netcoreapp3.1;net5.0;net6.0 + net7.0 false True Stefan Steiger and Contributors diff --git a/PdfSharpCore.Charting/PdfSharpCore.Charting.csproj b/PdfSharpCore.Charting/PdfSharpCore.Charting.csproj index 83761556..9a8c8ea0 100644 --- a/PdfSharpCore.Charting/PdfSharpCore.Charting.csproj +++ b/PdfSharpCore.Charting/PdfSharpCore.Charting.csproj @@ -1,6 +1,6 @@  - netstandard2.0;netcoreapp3.1;net5.0;net6.0 + net7.0 false True Stefan Steiger and Contributors diff --git a/PdfSharpCore.Test/PdfSharpCore.Test.csproj b/PdfSharpCore.Test/PdfSharpCore.Test.csproj index 5db969bc..46a130a8 100644 --- a/PdfSharpCore.Test/PdfSharpCore.Test.csproj +++ b/PdfSharpCore.Test/PdfSharpCore.Test.csproj @@ -1,7 +1,7 @@ - netcoreapp3.1;net5.0;net6.0 + net7.0 false false diff --git a/PdfSharpCore/Pdf.IO/PdfWriter.cs b/PdfSharpCore/Pdf.IO/PdfWriter.cs index a0bb5334..0b14ea67 100644 --- a/PdfSharpCore/Pdf.IO/PdfWriter.cs +++ b/PdfSharpCore/Pdf.IO/PdfWriter.cs @@ -198,8 +198,8 @@ public void Write(PdfString value) WriteSeparator(CharCat.Delimiter); PdfStringEncoding encoding = (PdfStringEncoding)(value.Flags & PdfStringFlags.EncodingMask); string pdf = (value.Flags & PdfStringFlags.HexLiteral) == 0 ? - PdfEncoders.ToStringLiteral(value.EncryptionValue, encoding == PdfStringEncoding.Unicode, SecurityHandler) : - PdfEncoders.ToHexStringLiteral(value.EncryptionValue, encoding == PdfStringEncoding.Unicode, SecurityHandler, value.PaddingLeft); + PdfEncoders.ToStringLiteral(value.Value, PdfStringEncoding.Unicode, SecurityHandler) : + PdfEncoders.ToHexStringLiteral(value.Value, encoding, SecurityHandler, value.PaddingLeft); WriteRaw(pdf); _lastCat = CharCat.Delimiter; diff --git a/PdfSharpCore/PdfSharpCore.csproj b/PdfSharpCore/PdfSharpCore.csproj index 9dc55fc8..6aee7d87 100644 --- a/PdfSharpCore/PdfSharpCore.csproj +++ b/PdfSharpCore/PdfSharpCore.csproj @@ -1,7 +1,7 @@  - netstandard2.0;netcoreapp3.1;net5.0;net6.0 + net7.0 false True Stefan Steiger and Contributors diff --git a/SignatureTestConsole/Program.cs b/SignatureTestConsole/Program.cs index 1ff85b28..57c8269b 100644 --- a/SignatureTestConsole/Program.cs +++ b/SignatureTestConsole/Program.cs @@ -57,7 +57,7 @@ private static void SignExisting() private static X509Certificate2 GetCertificate() { // add yours here - return new X509Certificate2("TestFiles\\myself.pfx", "1234", X509KeyStorageFlags.Exportable); + return new X509Certificate2("c:\\repos\\Secrets\\CodeSign\\Lers-SelfSigned.pfx", "doZa34Pqmvui-76", X509KeyStorageFlags.Exportable); } private class SignAppearenceHandler : ISignatureAppearanceHandler diff --git a/SignatureTestConsole/SignatureTestConsole.csproj b/SignatureTestConsole/SignatureTestConsole.csproj index cdf8ea35..0a2e05cb 100644 --- a/SignatureTestConsole/SignatureTestConsole.csproj +++ b/SignatureTestConsole/SignatureTestConsole.csproj @@ -2,7 +2,7 @@ Exe - netcoreapp3.1;net5.0;net6.0 + net7.0