'Declaration Public Class PdfSignatureInformation Inherits Vintasoft.Imaging.Pdf.Tree.PdfTreeNodeBase
public class PdfSignatureInformation : Vintasoft.Imaging.Pdf.Tree.PdfTreeNodeBase
public __gc class PdfSignatureInformation : public Vintasoft.Imaging.Pdf.Tree.PdfTreeNodeBase*
public ref class PdfSignatureInformation : public Vintasoft.Imaging.Pdf.Tree.PdfTreeNodeBase^
Если эта подпись должна быть проверена, создайте объект подписи PKCS с помощью метода GetSignature и проверьте подпись с помощью метода Verify.
Если подпись не покрывает весь документ, т. е. метод SignatureCoversWholeDocument возвращает false, проверьте последующие изменения с помощью Метод GetDocumentChanges.
Вот пример, показывающий, как отобразить информацию о цифровых подписях и проверить цифровые подписи PDF документа:
''' <summary>
''' Displays and verifies signatures of PDF document.
''' </summary>
''' <param name="pdfFilename">The filename of PDF document.</param>
Public Shared Sub VerifyDocumentSignatures(pdfFilename As String)
' open PDF document
Using document As New Vintasoft.Imaging.Pdf.PdfDocument(pdfFilename)
' if document does not have interactive form
If document.InteractiveForm Is Nothing Then
System.Console.WriteLine("Signature fields are not found.")
Return
End If
' get an array of signature fields of document
Dim signatureFields As Vintasoft.Imaging.Pdf.Tree.InteractiveForms.PdfInteractiveFormSignatureField() = document.InteractiveForm.GetSignatureFields()
' if document does not have signature fields
If signatureFields.Length = 0 Then
System.Console.WriteLine("Signture fields are not found.")
Return
End If
' for each signature field
For i As Integer = 0 To signatureFields.Length - 1
' get reference to the signature field
Dim signatureField As Vintasoft.Imaging.Pdf.Tree.InteractiveForms.PdfInteractiveFormSignatureField = signatureFields(i)
' print signature field name
System.Console.WriteLine(String.Format("[{0}]Signaure field: {1}", i + 1, signatureField.FullyQualifiedName))
' get information about signature
Dim signatureInfo As Vintasoft.Imaging.Pdf.Tree.DigitalSignatures.PdfSignatureInformation = signatureField.SignatureInfo
' if signature information is empty
If signatureInfo Is Nothing Then
System.Console.WriteLine("Empty signature field.")
Else
' if signature information is NOT empty
' check is document timestamp signature
If signatureInfo.IsTimeStamp Then
System.Console.WriteLine("Signature is a document timestamp signature")
End If
' print signature filter
System.Console.WriteLine(String.Format("Filter : {0} ({1})", signatureInfo.Filter, signatureInfo.SubFilter))
' print the signer name
If signatureInfo.SignerName IsNot Nothing Then
System.Console.WriteLine(String.Format("Signed by : {0}", signatureInfo.SignerName))
End If
' print the signature reason
If signatureInfo.Reason IsNot Nothing Then
System.Console.WriteLine(String.Format("Reason : {0}", signatureInfo.Reason))
End If
' print the signature location
If signatureInfo.Location IsNot Nothing Then
System.Console.WriteLine(String.Format("Location : {0}", signatureInfo.Location))
End If
' print the signer contact info
If signatureInfo.ContactInfo IsNot Nothing Then
System.Console.WriteLine(String.Format("Contact Info: {0}", signatureInfo.SignerName))
End If
' print the signing date
If signatureInfo.SigningTime <> System.DateTime.MinValue Then
System.Console.WriteLine(String.Format("Signig Date : {0}", signatureInfo.SigningTime.ToString("f")))
End If
' get PKCS signature
Dim [error] As Boolean = False
Dim signature As Vintasoft.Imaging.Pdf.Tree.DigitalSignatures.PdfPkcsSignature = Nothing
Try
signature = signatureInfo.GetSignature()
Catch e As System.Exception
[error] = True
System.Console.WriteLine("PKCS signature parsing error: {0}", e.Message)
End Try
If [error] Then
Continue For
End If
' print name of signature algorithm
System.Console.WriteLine(String.Format("Algorithm : {0}", signature.SignatureAlgorithmName))
' print information about signature certificate chain
System.Console.WriteLine("Sign certificate chain:")
Dim signCertChain As System.Security.Cryptography.X509Certificates.X509Certificate2() = signature.SigningCertificateChain
Dim padding As String = ""
For Each cert As System.Security.Cryptography.X509Certificates.X509Certificate2 In signCertChain
padding += " "
System.Console.WriteLine("{0}Serial number: {1}", padding, cert.SerialNumber)
System.Console.WriteLine("{0}Issuer : {1}", padding, cert.GetNameInfo(System.Security.Cryptography.X509Certificates.X509NameType.SimpleName, True))
System.Console.WriteLine("{0}Subject : {1}", padding, cert.GetNameInfo(System.Security.Cryptography.X509Certificates.X509NameType.SimpleName, False))
Next
' verify digital signature
VerifyDigitalSignature(signatureInfo, signature)
End If
System.Console.WriteLine()
Next
End Using
End Sub
''' <summary>
''' Verifies the digital signature.
''' </summary>
''' <param name="signature">The signature.</param>
''' <param name="signatureInfo">The signature information.</param>
''' <returns><b>true</b> if signature is valid; otherwise, <b>false</b>.</returns>
Public Shared Function VerifyDigitalSignature(signatureInfo As Vintasoft.Imaging.Pdf.Tree.DigitalSignatures.PdfSignatureInformation, signature As Vintasoft.Imaging.Pdf.Tree.DigitalSignatures.PdfPkcsSignature) As Boolean
System.Console.WriteLine("Verifying signature...")
Dim signatureVerifyResult As Boolean = False
Dim embeddedTimestampVerifyResult As Boolean = False
Dim certificateVerifyResult As Boolean = False
Dim embeddedTimestampCertificateVerifyResult As Boolean = False
Dim signatureCoversWholeDocument As Boolean = False
Dim certificateChain As System.Security.Cryptography.X509Certificates.X509Chain = Nothing
Dim timestampCertificateChain As System.Security.Cryptography.X509Certificates.X509Chain = Nothing
' verify signature
Try
' check that signature covers the whole document
signatureCoversWholeDocument = signatureInfo.SignatureCoversWholeDocument()
' verify PKCS signature
signatureVerifyResult = signature.VerifySignature()
' if signature has embedded timestamp
If signature.HasEmbeddedTimeStamp Then
' verify embedded timestamp
embeddedTimestampVerifyResult = signature.VerifyTimestamp()
End If
' build and verify certificate chain
certificateChain = New System.Security.Cryptography.X509Certificates.X509Chain()
certificateVerifyResult = certificateChain.Build(signature.SigningCertificate)
' if signature has embedded timestamp
If signature.HasEmbeddedTimeStamp Then
' build and verify timestamp certificate chain
timestampCertificateChain = New System.Security.Cryptography.X509Certificates.X509Chain()
embeddedTimestampCertificateVerifyResult = certificateChain.Build(signature.TimestampCertificate)
End If
Catch verificationException As System.Exception
System.Console.WriteLine("Verification failed: {0}", verificationException.Message)
Return False
End Try
Dim pageContentModified As Boolean = False
Dim subsequentChangesMessage As String = ""
' if PKCS signature verification is passed AND signature does not cover the whole document
If signatureVerifyResult AndAlso Not signatureCoversWholeDocument Then
Try
' if signature has revision info
If signatureInfo.SignedRevision IsNot Nothing Then
' check subsequent changes
Using documentChanges As Vintasoft.Imaging.Pdf.PdfDocumentRevisionComparer = signatureInfo.GetDocumentChanges()
' check subsequent changes in pages content
pageContentModified = documentChanges.HasModifiedPages
' build subsequent changes message
If documentChanges.ChangedPageContents.Count > 0 Then
subsequentChangesMessage += String.Format("{0} page(s) modified; ", documentChanges.ChangedPageContents.Count)
End If
If documentChanges.AddedPages.Count > 0 Then
subsequentChangesMessage += String.Format("{0} page(s) added; ", documentChanges.AddedPages.Count)
End If
If documentChanges.RemovedPages.Count > 0 Then
subsequentChangesMessage += String.Format("{0} page(s) removed; ", documentChanges.RemovedPages.Count)
End If
If documentChanges.RemovedAnnotations.Count > 0 Then
subsequentChangesMessage += String.Format("annotations(s) on {0} page(s) removed; ", documentChanges.RemovedAnnotations.Count)
End If
If documentChanges.RemovedAnnotations.Count > 0 Then
subsequentChangesMessage += String.Format("removed annotation(s) on {0} page(s); ", documentChanges.RemovedAnnotations.Count)
End If
If documentChanges.AddedAnnotations.Count > 0 Then
subsequentChangesMessage += String.Format("added annotation(s) on {0} page(s); ", documentChanges.AddedAnnotations.Count)
End If
If documentChanges.ChangedAnnotations.Count > 0 Then
subsequentChangesMessage += String.Format("changed annotation(s) on {0} page(s); ", documentChanges.ChangedAnnotations.Count)
End If
If documentChanges.MiscellaneousChanges.Count > 0 Then
subsequentChangesMessage += String.Format("miscellaneous changes: {0}; ", documentChanges.MiscellaneousChanges.Count)
End If
End Using
End If
Catch verificationException As System.Exception
System.Console.WriteLine("Verification failed: {0}", verificationException.Message)
Return False
End Try
End If
' print signature verification result
' if PKCS signature verification is failed OR
' signature does not cover the whole document AND page(s) content is modified
If Not signatureVerifyResult OrElse (Not signatureCoversWholeDocument AndAlso pageContentModified) Then
System.Console.WriteLine("Signature is INVALID.")
' if certificate verification is failed
ElseIf Not certificateVerifyResult OrElse (signature.HasEmbeddedTimeStamp AndAlso (Not embeddedTimestampCertificateVerifyResult OrElse Not embeddedTimestampVerifyResult)) Then
System.Console.WriteLine("Signature validity is UNKNOWN.")
Else
System.Console.WriteLine("Signature is VALID.")
End If
' print signature verification details
' if signature verification is successful
If signatureVerifyResult Then
' if signature covers the whole document
If signatureCoversWholeDocument Then
System.Console.WriteLine(" Signature verification: Document has not been modified since this signature was applied.")
Else
' if signature does NOT cover the whole document
If pageContentModified Then
System.Console.WriteLine(" Signature verification: Document has been modified or corrupted since it was signed.")
System.Console.WriteLine(String.Format(" Subsequent changes: {0}.", subsequentChangesMessage))
ElseIf subsequentChangesMessage <> "" Then
System.Console.WriteLine(" Signature verification: The revision of the document that was covered by this signature has not been altered; however, there have been subsequent changes to the document.")
System.Console.WriteLine(String.Format(" Subsequent changes: {0}.", subsequentChangesMessage))
Else
System.Console.WriteLine(" Signature verification: Document has not been modified since this signature was applied.")
End If
End If
Else
' if signature verification is NOT successful
System.Console.WriteLine(" Signature verification: Document has been modified or corrupted since it was signed.")
End If
' if signature has embedded timestamp
If signature.HasEmbeddedTimeStamp Then
If embeddedTimestampVerifyResult Then
System.Console.WriteLine(" Timestamp verification: Timestamp is valid.")
Else
System.Console.WriteLine(" Timestamp verification: Timestamp is valid.")
End If
End If
' print certificate verification details
' if certificate chain is present
If certificateChain IsNot Nothing Then
' if certificate verification is successful
If certificateVerifyResult Then
System.Console.WriteLine(" Certificate verification: Signer's certificate is valid.")
Else
' if certificate verification is NOT successful
' print certificate verification status
System.Console.WriteLine(" Certificate verification: Signer's certificate is invalid:")
For Each status As System.Security.Cryptography.X509Certificates.X509ChainStatus In certificateChain.ChainStatus
System.Console.Write(String.Format(" {0}: {1}", status.Status, status.StatusInformation))
Next
End If
End If
' if timestamp certificate chain is present
If timestampCertificateChain IsNot Nothing Then
' if timestamp certificate verification is successful
If embeddedTimestampCertificateVerifyResult Then
System.Console.WriteLine(" Timestamp certificate verification: Signer's certificate is valid.")
Else
' if timestamp certificate verification is NOT successful
' print certificate verification status
System.Console.WriteLine(" Timestamp certificate verification: Signer's certificate is invalid:")
For Each status As System.Security.Cryptography.X509Certificates.X509ChainStatus In timestampCertificateChain.ChainStatus
System.Console.Write(String.Format(" {0}: {1}", status.Status, status.StatusInformation))
Next
End If
End If
' if signature is not verified
If Not signatureVerifyResult Then
Return False
End If
' if signature does NOT cover the whole document and page content was modified
If Not signatureCoversWholeDocument AndAlso pageContentModified Then
Return False
End If
' if signature certificate is NOT verified
If Not certificateVerifyResult Then
Return False
End If
If signature.HasEmbeddedTimeStamp Then
' if timestamp is NOT verified
If Not embeddedTimestampVerifyResult Then
Return False
End If
' if timestamp certifiacet is NOT verified
If Not embeddedTimestampCertificateVerifyResult Then
Return False
End If
End If
' sigature is VALID
Return True
End Function
/// <summary>
/// Displays and verifies signatures of PDF document.
/// </summary>
/// <param name="pdfFilename">The filename of PDF document.</param>
public static void VerifyDocumentSignatures(string pdfFilename)
{
// open PDF document
using (Vintasoft.Imaging.Pdf.PdfDocument document =
new Vintasoft.Imaging.Pdf.PdfDocument(pdfFilename))
{
// if document does not have interactive form
if (document.InteractiveForm == null)
{
System.Console.WriteLine("Signature fields are not found.");
return;
}
// get an array of signature fields of document
Vintasoft.Imaging.Pdf.Tree.InteractiveForms.PdfInteractiveFormSignatureField[] signatureFields =
document.InteractiveForm.GetSignatureFields();
// if document does not have signature fields
if (signatureFields.Length == 0)
{
System.Console.WriteLine("Signture fields are not found.");
return;
}
// for each signature field
for (int i = 0; i < signatureFields.Length; i++)
{
// get reference to the signature field
Vintasoft.Imaging.Pdf.Tree.InteractiveForms.PdfInteractiveFormSignatureField signatureField = signatureFields[i];
// print signature field name
System.Console.WriteLine(string.Format("[{0}]Signaure field: {1}", i + 1, signatureField.FullyQualifiedName));
// get information about signature
Vintasoft.Imaging.Pdf.Tree.DigitalSignatures.PdfSignatureInformation signatureInfo = signatureField.SignatureInfo;
// if signature information is empty
if (signatureInfo == null)
{
System.Console.WriteLine("Empty signature field.");
}
// if signature information is NOT empty
else
{
// check is document timestamp signature
if (signatureInfo.IsTimeStamp)
System.Console.WriteLine("Signature is a document timestamp signature");
// print signature filter
System.Console.WriteLine(string.Format("Filter : {0} ({1})", signatureInfo.Filter, signatureInfo.SubFilter));
// print the signer name
if (signatureInfo.SignerName != null)
System.Console.WriteLine(string.Format("Signed by : {0}", signatureInfo.SignerName));
// print the signature reason
if (signatureInfo.Reason != null)
System.Console.WriteLine(string.Format("Reason : {0}", signatureInfo.Reason));
// print the signature location
if (signatureInfo.Location != null)
System.Console.WriteLine(string.Format("Location : {0}", signatureInfo.Location));
// print the signer contact info
if (signatureInfo.ContactInfo != null)
System.Console.WriteLine(string.Format("Contact Info: {0}", signatureInfo.SignerName));
// print the signing date
if (signatureInfo.SigningTime != System.DateTime.MinValue)
System.Console.WriteLine(string.Format("Signig Date : {0}", signatureInfo.SigningTime.ToString("f")));
// get PKCS signature
bool error = false;
Vintasoft.Imaging.Pdf.Tree.DigitalSignatures.PdfPkcsSignature signature = null;
try
{
signature = signatureInfo.GetSignature();
}
catch (System.Exception e)
{
error = true;
System.Console.WriteLine("PKCS signature parsing error: {0}", e.Message);
}
if (error)
continue;
// print name of signature algorithm
System.Console.WriteLine(string.Format("Algorithm : {0}", signature.SignatureAlgorithmName));
// print information about signature certificate chain
System.Console.WriteLine("Sign certificate chain:");
System.Security.Cryptography.X509Certificates.X509Certificate2[] signCertChain =
signature.SigningCertificateChain;
string padding = "";
foreach (System.Security.Cryptography.X509Certificates.X509Certificate2 cert in signCertChain)
{
padding += " ";
System.Console.WriteLine("{0}Serial number: {1}", padding, cert.SerialNumber);
System.Console.WriteLine("{0}Issuer : {1}", padding, cert.GetNameInfo(
System.Security.Cryptography.X509Certificates.X509NameType.SimpleName, true));
System.Console.WriteLine("{0}Subject : {1}", padding, cert.GetNameInfo(
System.Security.Cryptography.X509Certificates.X509NameType.SimpleName, false));
}
// verify digital signature
VerifyDigitalSignature(signatureInfo, signature);
}
System.Console.WriteLine();
}
}
}
/// <summary>
/// Verifies the digital signature.
/// </summary>
/// <param name="signature">The signature.</param>
/// <param name="signatureInfo">The signature information.</param>
/// <returns><b>true</b> if signature is valid; otherwise, <b>false</b>.</returns>
public static bool VerifyDigitalSignature(
Vintasoft.Imaging.Pdf.Tree.DigitalSignatures.PdfSignatureInformation signatureInfo,
Vintasoft.Imaging.Pdf.Tree.DigitalSignatures.PdfPkcsSignature signature)
{
System.Console.WriteLine("Verifying signature...");
bool signatureVerifyResult = false;
bool embeddedTimestampVerifyResult = false;
bool certificateVerifyResult = false;
bool embeddedTimestampCertificateVerifyResult = false;
bool signatureCoversWholeDocument = false;
System.Security.Cryptography.X509Certificates.X509Chain certificateChain = null;
System.Security.Cryptography.X509Certificates.X509Chain timestampCertificateChain = null;
// verify signature
try
{
// check that signature covers the whole document
signatureCoversWholeDocument = signatureInfo.SignatureCoversWholeDocument();
// verify PKCS signature
signatureVerifyResult = signature.VerifySignature();
// if signature has embedded timestamp
if (signature.HasEmbeddedTimeStamp)
{
// verify embedded timestamp
embeddedTimestampVerifyResult = signature.VerifyTimestamp();
}
// build and verify certificate chain
certificateChain = new System.Security.Cryptography.X509Certificates.X509Chain();
certificateVerifyResult = certificateChain.Build(signature.SigningCertificate);
// if signature has embedded timestamp
if (signature.HasEmbeddedTimeStamp)
{
// build and verify timestamp certificate chain
timestampCertificateChain = new System.Security.Cryptography.X509Certificates.X509Chain();
embeddedTimestampCertificateVerifyResult = certificateChain.Build(signature.TimestampCertificate);
}
}
catch (System.Exception verificationException)
{
System.Console.WriteLine("Verification failed: {0}", verificationException.Message);
return false;
}
bool pageContentModified = false;
string subsequentChangesMessage = "";
// if PKCS signature verification is passed AND signature does not cover the whole document
if (signatureVerifyResult && !signatureCoversWholeDocument)
{
try
{
// if signature has revision info
if (signatureInfo.SignedRevision != null)
{
// check subsequent changes
using (Vintasoft.Imaging.Pdf.PdfDocumentRevisionComparer documentChanges = signatureInfo.GetDocumentChanges())
{
// check subsequent changes in pages content
pageContentModified = documentChanges.HasModifiedPages;
// build subsequent changes message
if (documentChanges.ChangedPageContents.Count > 0)
subsequentChangesMessage += string.Format("{0} page(s) modified; ", documentChanges.ChangedPageContents.Count);
if (documentChanges.AddedPages.Count > 0)
subsequentChangesMessage += string.Format("{0} page(s) added; ", documentChanges.AddedPages.Count);
if (documentChanges.RemovedPages.Count > 0)
subsequentChangesMessage += string.Format("{0} page(s) removed; ", documentChanges.RemovedPages.Count);
if (documentChanges.RemovedAnnotations.Count > 0)
subsequentChangesMessage += string.Format("annotations(s) on {0} page(s) removed; ", documentChanges.RemovedAnnotations.Count);
if (documentChanges.RemovedAnnotations.Count > 0)
subsequentChangesMessage += string.Format("removed annotation(s) on {0} page(s); ", documentChanges.RemovedAnnotations.Count);
if (documentChanges.AddedAnnotations.Count > 0)
subsequentChangesMessage += string.Format("added annotation(s) on {0} page(s); ", documentChanges.AddedAnnotations.Count);
if (documentChanges.ChangedAnnotations.Count > 0)
subsequentChangesMessage += string.Format("changed annotation(s) on {0} page(s); ", documentChanges.ChangedAnnotations.Count);
if (documentChanges.MiscellaneousChanges.Count > 0)
subsequentChangesMessage += string.Format("miscellaneous changes: {0}; ", documentChanges.MiscellaneousChanges.Count);
}
}
}
catch (System.Exception verificationException)
{
System.Console.WriteLine("Verification failed: {0}", verificationException.Message);
return false;
}
}
// print signature verification result
// if PKCS signature verification is failed OR
// signature does not cover the whole document AND page(s) content is modified
if (!signatureVerifyResult || (!signatureCoversWholeDocument && pageContentModified))
System.Console.WriteLine("Signature is INVALID.");
// if certificate verification is failed
else if (!certificateVerifyResult || (signature.HasEmbeddedTimeStamp && (!embeddedTimestampCertificateVerifyResult || !embeddedTimestampVerifyResult)))
System.Console.WriteLine("Signature validity is UNKNOWN.");
else
System.Console.WriteLine("Signature is VALID.");
// print signature verification details
// if signature verification is successful
if (signatureVerifyResult)
{
// if signature covers the whole document
if (signatureCoversWholeDocument)
{
System.Console.WriteLine(" Signature verification: Document has not been modified since this signature was applied.");
}
// if signature does NOT cover the whole document
else
{
if (pageContentModified)
{
System.Console.WriteLine(" Signature verification: Document has been modified or corrupted since it was signed.");
System.Console.WriteLine(string.Format(" Subsequent changes: {0}.", subsequentChangesMessage));
}
else if (subsequentChangesMessage != "")
{
System.Console.WriteLine(" Signature verification: The revision of the document that was covered by this signature has not been altered; however, there have been subsequent changes to the document.");
System.Console.WriteLine(string.Format(" Subsequent changes: {0}.", subsequentChangesMessage));
}
else
{
System.Console.WriteLine(" Signature verification: Document has not been modified since this signature was applied.");
}
}
}
// if signature verification is NOT successful
else
{
System.Console.WriteLine(" Signature verification: Document has been modified or corrupted since it was signed.");
}
// if signature has embedded timestamp
if (signature.HasEmbeddedTimeStamp)
{
if (embeddedTimestampVerifyResult)
System.Console.WriteLine(" Timestamp verification: Timestamp is valid.");
else
System.Console.WriteLine(" Timestamp verification: Timestamp is valid.");
}
// print certificate verification details
// if certificate chain is present
if (certificateChain != null)
{
// if certificate verification is successful
if (certificateVerifyResult)
{
System.Console.WriteLine(" Certificate verification: Signer's certificate is valid.");
}
// if certificate verification is NOT successful
else
{
// print certificate verification status
System.Console.WriteLine(" Certificate verification: Signer's certificate is invalid:");
foreach (System.Security.Cryptography.X509Certificates.X509ChainStatus status in certificateChain.ChainStatus)
System.Console.Write(string.Format(" {0}: {1}", status.Status, status.StatusInformation));
}
}
// if timestamp certificate chain is present
if (timestampCertificateChain != null)
{
// if timestamp certificate verification is successful
if (embeddedTimestampCertificateVerifyResult)
{
System.Console.WriteLine(" Timestamp certificate verification: Signer's certificate is valid.");
}
// if timestamp certificate verification is NOT successful
else
{
// print certificate verification status
System.Console.WriteLine(" Timestamp certificate verification: Signer's certificate is invalid:");
foreach (System.Security.Cryptography.X509Certificates.X509ChainStatus status in timestampCertificateChain.ChainStatus)
System.Console.Write(string.Format(" {0}: {1}", status.Status, status.StatusInformation));
}
}
// if signature is not verified
if (!signatureVerifyResult)
return false;
// if signature does NOT cover the whole document and page content was modified
if (!signatureCoversWholeDocument && pageContentModified)
return false;
// if signature certificate is NOT verified
if (!certificateVerifyResult)
return false;
if (signature.HasEmbeddedTimeStamp)
{
// if timestamp is NOT verified
if (!embeddedTimestampVerifyResult)
return false;
// if timestamp certifiacet is NOT verified
if (!embeddedTimestampCertificateVerifyResult)
return false;
}
// sigature is VALID
return true;
}
System.Object
 Vintasoft.Imaging.Pdf.Tree.PdfTreeNodeBase
   Vintasoft.Imaging.Pdf.Tree.DigitalSignatures.PdfSignatureInformation
Целевые платформы: .NET 9; .NET 8; .NET 7; .NET 6; .NET Framework 4.8, 4.7, 4.6, 4.5, 4.0, 3.5
Члены типа PdfSignatureInformation
Пространство имен Vintasoft.Imaging.Pdf.Tree.DigitalSignatures
PdfPkcsSignature
SignatureInfo