Skip to content

Commit 2e2a6c0

Browse files
committed
263723: Added PEM certificate sample
1 parent a65928a commit 2e2a6c0

File tree

7 files changed

+138
-0
lines changed

7 files changed

+138
-0
lines changed
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
2+
Microsoft Visual Studio Solution File, Format Version 12.00
3+
# Visual Studio Version 17
4+
VisualStudioVersion = 17.14.36616.10 d17.14
5+
MinimumVisualStudioVersion = 10.0.40219.1
6+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sign-PDF-with-PEM-Certificate", "Sign-PDF-with-PEM-Certificate\Sign-PDF-with-PEM-Certificate.csproj", "{15D14533-D3DD-4F05-9652-4DF196C648E3}"
7+
EndProject
8+
Global
9+
GlobalSection(SolutionConfigurationPlatforms) = preSolution
10+
Debug|Any CPU = Debug|Any CPU
11+
Release|Any CPU = Release|Any CPU
12+
EndGlobalSection
13+
GlobalSection(ProjectConfigurationPlatforms) = postSolution
14+
{15D14533-D3DD-4F05-9652-4DF196C648E3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
15+
{15D14533-D3DD-4F05-9652-4DF196C648E3}.Debug|Any CPU.Build.0 = Debug|Any CPU
16+
{15D14533-D3DD-4F05-9652-4DF196C648E3}.Release|Any CPU.ActiveCfg = Release|Any CPU
17+
{15D14533-D3DD-4F05-9652-4DF196C648E3}.Release|Any CPU.Build.0 = Release|Any CPU
18+
EndGlobalSection
19+
GlobalSection(SolutionProperties) = preSolution
20+
HideSolutionNode = FALSE
21+
EndGlobalSection
22+
GlobalSection(ExtensibilityGlobals) = postSolution
23+
SolutionGuid = {6F0575C6-8A8D-414F-84C6-11C432B44578}
24+
EndGlobalSection
25+
EndGlobal
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIEIDCCA+CgAwIBAgIUd5tYHFakkBrSoRMsnF9bwlIdj7YwCQYHKoZIzjgEAzAjMSEwHwYDVQQD
3+
ExhUb2tlbiBTaWduaW5nIFB1YmxpYyBLZXkwHhcNMTcwNTExMDUxMjE4WhcNMTcwNTE4MDUxMjE4
4+
WjAtMSswKQYDVQQDHiIANQAxADUANQA4AGIANAAxAGQANwBhADgAYgAzADgANQAAMIGfMA0GCSqG
5+
SIb3DQEBAQUAA4GNADCBiQKBgQCreQXHLNcWSKp4pKYo0p8J/t77ZWGdJdlM1RxgrjPxnCpUtrhb
6+
2mqwha5fJ/sKRzU/dEUa5dPZCZWcT6sqX5/Hlrvm2/c5Ij59vohOxdwEhxuL1HMLjQdtz3hZTE91
7+
DD6/uu330xWUoEV9IobGitsrhRTykVVNnvA64I09lvnEuwIDAQABo4ICoDCCApwwDgYDVR0PAQH/
8+
BAQDAgWgMBMGA1UdJQQMMAoGCCsGAQUFBwMCMIIB/wYDVR0gBIIB9jCCAfIwggHuBgorBgEEAYI3
9+
MwMCMIIB3jCCAdoGCCsGAQUFBwICMIIBzB6CAcgATQBpAGMAcgBvAHMAbwBmAHQAIABkAG8AZQBz
10+
ACAAbgBvAHQAIAB3AGEAcgByAGEAbgB0ACAAbwByACAAYwBsAGEAaQBtACAAdABoAGEAdAAgAHQA
11+
aABlACAAaQBuAGYAbwByAG0AYQB0AGkAbwBuACAAZABpAHMAcABsAGEAeQBlAGQAIABpAG4AIAB0
12+
AGgAaQBzACAAYwBlAHIAdABpAGYAaQBjAGEAdABlACAAaQBzACAAYwB1AHIAcgBlAG4AdAAgAG8A
13+
cgAgAGEAYwBjAHUAcgBhAHQAZQAsACAAbgBvAHIAIABkAG8AZQBzACAAaQB0ACAAbQBhAGsAZQAg
14+
AGEAbgB5ACAAZgBvAHIAbQBhAGwAIABzAHQAYQB0AGUAbQBlAG4AdABzACAAYQBiAG8AdQB0ACAA
15+
dABoAGUAIABxAHUAYQBsAGkAdAB5ACAAbwByACAAcwBhAGYAZQB0AHkAIABvAGYAIABkAGEAdABh
16+
ACAAcwBpAGcAbgBlAGQAIAB3AGkAdABoACAAdABoAGUAIABjAG8AcgByAGUAcwBwAG8AbgBkAGkA
17+
bgBnACAAcAByAGkAdgBhAHQAZQAgAGsAZQB5AC4wUwYDVR0jBEwwSoAURtLCWz4DNCN5LhccABko
18+
THEQK2ShJ6QlMCMxITAfBgNVBAMTGFRva2VuIFNpZ25pbmcgUHVibGljIEtleYIJAL67zDTCqZpD
19+
MB0GA1UdDgQWBBR+L+E5CKYJmufz2XcGMOFu+hb3LjAJBgcqhkjOOAQDAy8AMCwCFErwQFvnFgVT
20+
Pcnh4wfjaGMjKStIAhQJ9ouuyB8Ot8+emod0q68bbGuEWg==
21+
-----END CERTIFICATE-----
20.9 KB
Loading
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
-----BEGIN RSA PRIVATE KEY-----
2+
MIICWwIBAAKBgQCreQXHLNcWSKp4pKYo0p8J/t77ZWGdJdlM1RxgrjPxnCpUtrhb
3+
2mqwha5fJ/sKRzU/dEUa5dPZCZWcT6sqX5/Hlrvm2/c5Ij59vohOxdwEhxuL1HML
4+
jQdtz3hZTE91DD6/uu330xWUoEV9IobGitsrhRTykVVNnvA64I09lvnEuwIDAQAB
5+
AoGAFVZfeNv5vdz3/ZWQ1Ev1R2ikSwiKv46J/kzB6xPyWcfoNUIcKdiW5cq/b+Qz
6+
5yEE8sBJ/cwIncgwClNC8OhqTiyBJjK1KdyfMkUgdBTtwTiHcPMyxy5XTXyiSnVO
7+
2ig91PxVu7B+gTjZYX0/Sv3KxiPmQvQ7KF/3iAoGDoQpwrkCQQDUYiKyqLuJyU3z
8+
G7MxCX3fxCAdUndtTXq5IRGklLtsuRFG2qvA3psgptDBnG+Damm1/5/YIV47lMe9
9+
ye6yiT75AkEAzrAMhb3+uCKEK0p//Ktdt0h5WF2uFf2KQ4ZmfRiAgl2KbpyXPZYC
10+
fc5t+WTs40D7W/A9NdUpc9yHqfN7WzGqUwJAVnUouOA1kA7R27CgDstVYZ1ekXE7
11+
ytQqrGiI3R3q+oSQQu7L0nUMY4tlGhwLzUypgfxw3rQev1R+x4UH1chHSQJAdJ3O
12+
IvPFMT2AVzCsr/I8aTpCBQKuQ4gPJ/RABVr6vxNqFOjTSJNICpWbZTh1k+9JI2GU
13+
F7iSr+WAwfo34odOMwJAJj9EibYjBlwrtIkv+cPSQ6OeBeZUrHCjOsnmS4z98Ju7
14+
mtYfb45W8VbAp5USJJP1t2jbywMutgDpsLw6wW/3jg==
15+
-----END RSA PRIVATE KEY-----

Digital Signature/Sign-PDF-with-PEM-Certificate/.NET/Sign-PDF-with-PEM-Certificate/Output/gitkeep.txt

Whitespace-only changes.
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
using Org.BouncyCastle.Asn1.Pkcs;
2+
using Org.BouncyCastle.Crypto;
3+
using Org.BouncyCastle.OpenSsl;
4+
using Org.BouncyCastle.Pkcs;
5+
using Org.BouncyCastle.Security;
6+
using Syncfusion.Drawing;
7+
using Syncfusion.Pdf;
8+
using Syncfusion.Pdf.Graphics;
9+
using Syncfusion.Pdf.Security;
10+
11+
//Creates a new PDF document.
12+
using (PdfDocument document = new PdfDocument())
13+
{
14+
//Add a new page.
15+
PdfPageBase page = document.Pages.Add();
16+
PdfGraphics graphics = page.Graphics;
17+
//Get the certificate file.
18+
Org.BouncyCastle.X509.X509CertificateParser cp = new Org.BouncyCastle.X509.X509CertificateParser();
19+
Org.BouncyCastle.X509.X509Certificate cert = cp.ReadCertificate(File.ReadAllBytes(Path.GetFullPath(@"Data/certificate.cer")));
20+
//Read the PEM file.
21+
PemReader pmr = new PemReader(new StringReader(File.ReadAllText(Path.GetFullPath(@"Data/privateKey.pem"))));
22+
AsymmetricCipherKeyPair KeyPair = (AsymmetricCipherKeyPair)pmr.ReadObject();
23+
//Get the PFX file stream.
24+
Stream pfxFile = CreatePfxFile(cert, KeyPair.Private);
25+
//Creates a certificate instance from the PFX file with a private key.
26+
PdfCertificate pdfCert = new PdfCertificate(pfxFile, "syncfusion");
27+
//Creates a digital signature.
28+
PdfSignature signature = new PdfSignature(document, page, pdfCert, "Signature");
29+
//Sets the signature information.
30+
signature.Bounds = new RectangleF(new PointF(0, 0), new SizeF(300, 100));
31+
signature.ContactInfo = "[email protected]";
32+
signature.LocationInfo = "Honolulu, Hawaii";
33+
signature.Reason = "I am author of this document.";
34+
FileStream imageStream = new FileStream(Path.GetFullPath(@"Data/Logo.png"), FileMode.Open, FileAccess.Read);
35+
//Load an image file.
36+
PdfBitmap image = new PdfBitmap(imageStream);
37+
//Draw an image in the signature appearance.
38+
signature.Appearance.Normal.Graphics.DrawImage(image, new RectangleF(0, 0, 300, 100));
39+
//Saves the document.
40+
document.Save(Path.GetFullPath(@"Output/Output.pdf"));
41+
}
42+
43+
// Create a PFX file using the BouncyCastle.
44+
static Stream CreatePfxFile(Org.BouncyCastle.X509.X509Certificate certificate, AsymmetricKeyParameter privateKey)
45+
{
46+
//Create a certificate entry.
47+
X509CertificateEntry certEntry = new X509CertificateEntry(certificate);
48+
string friendlyName = certificate.SubjectDN.ToString();
49+
//Get bytes of the private key.
50+
PrivateKeyInfo keyInfo = PrivateKeyInfoFactory.CreatePrivateKeyInfo(privateKey);
51+
byte[] keyBytes = keyInfo.ToAsn1Object().GetEncoded();
52+
Pkcs12StoreBuilder builder = new Pkcs12StoreBuilder();
53+
builder.SetUseDerEncoding(true);
54+
Pkcs12Store store = builder.Build();
55+
//Create a store entry.
56+
store.SetKeyEntry("private", new AsymmetricKeyEntry(privateKey), new X509CertificateEntry[] { certEntry });
57+
//Save the story to the stream.
58+
MemoryStream stream = new MemoryStream();
59+
store.Save(stream, "syncfusion".ToCharArray(), new SecureRandom());
60+
return stream;
61+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<OutputType>Exe</OutputType>
5+
<TargetFramework>net8.0</TargetFramework>
6+
<RootNamespace>Sign_PDF_with_PEM_Certificate</RootNamespace>
7+
<ImplicitUsings>enable</ImplicitUsings>
8+
<Nullable>enable</Nullable>
9+
</PropertyGroup>
10+
11+
<ItemGroup>
12+
<PackageReference Include="Portable.BouncyCastle" Version="1.9.0" />
13+
<PackageReference Include="Syncfusion.Pdf.Net.Core" Version="*" />
14+
</ItemGroup>
15+
16+
</Project>

0 commit comments

Comments
 (0)