Imports System.IO
Imports ComPDFKit.DigitalSign
Imports ComPDFKit.Import
Imports ComPDFKit.PDFAnnotation.Form
Imports ComPDFKit.PDFDocument
Imports ComPDFKit.PDFPage
Module DigitalSignatureTest
Private parentPath = Path.GetDirectoryName(Path.GetDirectoryName(Path.GetDirectoryName(System.IO.Directory.GetCurrentDirectory())))
Private outputPath As String = Path.Combine(parentPath, "Output", "VB")
Sub Main()
#Region "Preparation work"
Console.WriteLine("Running digital signature sample..." & vbCrLf)
SDKLicenseHelper.LicenseVerify()
Dim certificatePath As String = "Certificate.pfx"
Dim password As String = "ComPDFKit"
If Not Directory.Exists(outputPath) Then
Directory.CreateDirectory(outputPath)
End If
#End Region
#Region "Sample 0: Create certificate"
GenerateCertificate()
#End Region
#Region "Sample 1: Create digital signature"
Dim document As CPDFDocument = CPDFDocument.InitWithFilePath("CommonFivePage.pdf")
CreateDigitalSignature(document, certificatePath, password)
document.Release()
#End Region
#Region "Sample 2: Verify signature"
Dim signedDoc As CPDFDocument = CPDFDocument.InitWithFilePath("Signed.pdf")
VerifyDigitalSignature(signedDoc)
#End Region
#Region "Sample 3: Verify certificate"
VerifyCertificate(certificatePath, password)
#End Region
#Region "Sample 4: Print digital signature info"
PrintDigitalSignatureInfo(signedDoc)
#End Region
#Region "Sample 5: Trust Certificate"
TrustCertificate(signedDoc)
#End Region
#Region "Sample 6: Remove digital signature"
RemoveDigitalSignature(signedDoc)
signedDoc.Release()
#End Region
Console.WriteLine("Done!")
Console.ReadLine()
End Sub
'''
''' In the core function "CPDFPKCS12CertHelper.GeneratePKCS12Cert":
'''
''' Generate certificate
'''
''' Password: ComPDFKit
'''
''' info: /C=SG/O=ComPDFKit/D=R&D Department/CN=Alan/emailAddress=xxxx@example.com
'''
''' C=SG: This represents the country code "SG," which typically stands for Singapore.
''' O=ComPDFKit: This is the Organization (O) field, indicating the name of the organization or entity, in this case, "ComPDFKit."
''' D=R&D Department: This is the Department (D) field, indicating the specific department within the organization, in this case, "R&D Department."
''' CN=Alan: This is the Common Name (CN) field, which usually represents the name of the individual or entity. In this case, it is "Alan."
''' emailAddress=xxxx@example.com: Email is xxxx@example.com
'''
''' CPDFCertUsage.CPDFCertUsageAll: Used for both digital signing and data validation simultaneously.
'''
''' is_2048 = True: Enhanced security encryption.
'''
Private Sub GenerateCertificate()
Console.WriteLine("--------------------")
Console.WriteLine("Generate certificate signature.")
Dim info As String = "/C=SG/O=ComPDFKit/D=R&D Department/CN=Alan/emailAddress=xxxx@example.com"
Dim password As String = "ComPDFKit"
Dim filePath As String = outputPath & "\Certificate.pfx"
If CPDFPKCS12CertHelper.GeneratePKCS12Cert(info, password, filePath, CPDFCertUsage.CPDFCertUsageAll, True) Then
Console.WriteLine("File saved in " & filePath)
Console.WriteLine("Generate PKCS12 certificate done.")
Else
Console.WriteLine("Generate PKCS12 certificate failed.")
End If
Console.WriteLine("--------------------")
End Sub
'''
''' Adding a signature is divided into two steps:
''' creating a signature field and filling in the signature.
'''
''' Page Index: 0
''' Rect: CRect(28, 420, 150, 370)
''' Border RGB: {0, 0, 0}
''' Widget Background RGB: {150, 180, 210}
'''
''' Text: Grantor Name
''' Content:
''' Name: get grantor name from certificate
''' Date: now(yyyy.mm.dd)
''' Reason: I am the owner of the document.
''' DN: Subject
''' Location: Singapor
''' IsContentAlignLeft: False
''' IsDrawLogo: True
''' LogoBitmap: logo.png
''' text color RGB: {0, 0, 0}
''' content color RGB: {0, 0, 0}
''' Output file name: document.FileName + "_Signed.pdf"
'''
Private Sub CreateDigitalSignature(document As CPDFDocument, certificatePath As String, password As String)
Console.WriteLine("--------------------")
Console.WriteLine("Create digital signature.")
Dim certificate As CPDFSignatureCertificate = CPDFPKCS12CertHelper.GetCertificateWithPKCS12Path("Certificate.pfx", "ComPDFKit")
Dim page As CPDFPage = document.PageAtIndex(0)
Dim signatureField As CPDFSignatureWidget = TryCast(page.CreateWidget(C_WIDGET_TYPE.WIDGET_SIGNATUREFIELDS), CPDFSignatureWidget)
signatureField.SetRect(New CRect(28, 420, 150, 370))
signatureField.SetWidgetBorderRGBColor(New Byte() {0, 0, 0})
signatureField.SetWidgetBgRGBColor(New Byte() {150, 180, 210})
signatureField.UpdateAp()
Dim name As String = GetGrantorFromDictionary(certificate.SubjectDict) & vbCrLf
Dim [date] As String = DateTime.Now.ToString("yyyy.MM.dd HH:mm:ss")
Dim reason As String = "I am the owner of the document."
Dim location As String = certificate.SubjectDict("C")
Dim DN As String = certificate.Subject
Dim signatureConfig As New CPDFSignatureConfig With {
.Text = GetGrantorFromDictionary(certificate.SubjectDict),
.Content = "Name: " & name & Environment.NewLine &
"Date: " & [date] & Environment.NewLine &
"Reason: " & reason & " " & Environment.NewLine &
"Location: " & location & Environment.NewLine &
"DN: " & DN & Environment.NewLine,
.IsContentAlignLeft = False,
.IsDrawLogo = True,
.LogoData = File.ReadAllBytes("logo.png"),
.TextColor = New Single() {0, 0, 0},
.ContentColor = New Single() {0, 0, 0}
}
Dim filePath As String = outputPath & "\" & document.FileName & "_Signed.pdf"
signatureField.UpdataApWithSignature(signatureConfig)
If document.WriteSignatureToFilePath(signatureField,
filePath,
certificatePath, password,
location,
reason, CPDFSignaturePermissions.CPDFSignaturePermissionsNone) Then
Console.WriteLine("File saved in " & filePath)
Console.WriteLine("Create digital signature done.")
Else
Console.WriteLine("Create digital signature failed.")
End If
Console.WriteLine("--------------------")
End Sub
'''
''' Remove digital signature
''' You can choose if you want to remove the appearance
'''
'''
Private Sub RemoveDigitalSignature(document As CPDFDocument)
Console.WriteLine("--------------------")
Console.WriteLine("Remove digital signature.")
Dim signature As CPDFSignature = document.GetSignatureList()(0)
document.RemoveSignature(signature, True)
Dim filePath As String = outputPath & "\" & document.FileName & "_RemovedSign.pdf"
document.WriteToFilePath(filePath)
Console.WriteLine("File saved in " & filePath)
Console.WriteLine("Remove digital signature done.")
Console.WriteLine("--------------------")
End Sub
'''
''' There are two steps can help you to trust a certificate.
''' Set your trust path as a folder path,
''' then add your certificate to the trust path.
'''
Private Sub TrustCertificate(document As CPDFDocument)
Console.WriteLine("--------------------")
Console.WriteLine("Trust certificate.")
Dim signature As CPDFSignature = document.GetSignatureList()(0)
Dim signatureCertificate As CPDFSignatureCertificate = signature.SignerList(0).CertificateList(0)
Console.WriteLine("Certificate trusted status: " & signatureCertificate.IsTrusted.ToString())
Console.WriteLine("---Begin trusted---")
Dim trustedFolder As String = AppDomain.CurrentDomain.BaseDirectory & "\TrustedFolder\"
If Not Directory.Exists(trustedFolder) Then
Directory.CreateDirectory(trustedFolder)
End If
CPDFSignature.SignCertTrustedFolder = trustedFolder
If signatureCertificate.AddToTrustedCertificates() Then
Console.WriteLine("Certificate trusted status: " & signatureCertificate.IsTrusted.ToString())
Console.WriteLine("Trust certificate done.")
Else
Console.WriteLine("Trust certificate failed.")
End If
Console.WriteLine("--------------------")
End Sub
'''
''' Verify certificate
'''
''' To verify the trustworthiness of a certificate,
''' you need to verify that all certificates in the certificate chain are trustworthy.
'''
''' In ComPDFKit, this progress is automatic.
''' You should call the "CPDFSignatureCertificate.CheckCertificateIsTrusted" first.
''' then you can view the "CPDFSignatureCertificate.IsTrusted" property.
'''
''' Path to the certificate
''' Password for the certificate
Private Sub VerifyCertificate(certificatePath As String, password As String)
Console.WriteLine("--------------------")
Console.WriteLine("Verify certificate.")
Dim certificate As CPDFSignatureCertificate = CPDFPKCS12CertHelper.GetCertificateWithPKCS12Path(certificatePath, password)
certificate.CheckCertificateIsTrusted()
If certificate.IsTrusted Then
Console.WriteLine("Certificate is trusted")
Else
Console.WriteLine("Certificate is not trusted")
End If
Console.WriteLine("Verify certificate done.")
Console.WriteLine("--------------------")
End Sub
'''
''' Verify digital signature
'''
''' Refresh the validation status before reading the attributes, or else you may obtain inaccurate results.
''' Is the signature verified: indicating whether the document has been tampered with.
''' Is the certificate trusted: referring to the trust status of the certificate.
'''
''' A signed document
Private Sub VerifyDigitalSignature(document As CPDFDocument)
Console.WriteLine("--------------------")
Console.WriteLine("Verify digital signature.")
For Each signature As CPDFSignature In document.GetSignatureList()
signature.VerifySignatureWithDocument(document)
For Each signer As CPDFSigner In signature.SignerList
Console.WriteLine("Is the certificate trusted: " & signer.IsCertTrusted.ToString())
Console.WriteLine("Is the signature verified: " & signer.IsSignVerified.ToString())
If signer.IsCertTrusted AndAlso signer.IsSignVerified Then
' Signature is valid and the certificate is trusted
' Perform corresponding actions
ElseIf Not signer.IsCertTrusted AndAlso signer.IsSignVerified Then
' Signature is valid but the certificate is not trusted
' Perform corresponding actions
Else
' Signature is invalid
' Perform corresponding actions
End If
Next
Next
Console.WriteLine("Verify digital signature done.")
Console.WriteLine("--------------------")
End Sub
Public Function GetGrantorFromDictionary(dictionary As Dictionary(Of String, String)) As String
Dim grantor As String = String.Empty
dictionary.TryGetValue("CN", grantor)
If String.IsNullOrEmpty(grantor) Then
dictionary.TryGetValue("OU", grantor)
End If
If String.IsNullOrEmpty(grantor) Then
dictionary.TryGetValue("O", grantor)
End If
If String.IsNullOrEmpty(grantor) Then
grantor = "Unknown Signer"
End If
Return grantor
End Function
'''
''' This sample shows how to get main properties in a digital signature.
''' Read API reference to see all of the properties that can be obtained.
'''
''' A signed document
Private Sub PrintDigitalSignatureInfo(document As CPDFDocument)
Console.WriteLine("--------------------")
Console.WriteLine("Print digital signature info.")
For Each signature As CPDFSignature In document.GetSignatureList()
signature.VerifySignatureWithDocument(document)
Console.WriteLine("Name: " & signature.Name)
Console.WriteLine("Location: " & signature.Location)
Console.WriteLine("Reason: " & signature.Reason)
For Each signer As CPDFSigner In signature.SignerList
Console.WriteLine("Date: " & signer.AuthenDate)
For Each certificate As CPDFSignatureCertificate In signer.CertificateList
Console.WriteLine("Subject: " & certificate.Subject)
Next
Next
Next
Console.WriteLine("Print digital signature info done.")
Console.WriteLine("--------------------")
End Sub
End Module