DocWright.Signatures
1.1.4
dotnet add package DocWright.Signatures --version 1.1.4
NuGet\Install-Package DocWright.Signatures -Version 1.1.4
<PackageReference Include="DocWright.Signatures" Version="1.1.4" />
<PackageVersion Include="DocWright.Signatures" Version="1.1.4" />
<PackageReference Include="DocWright.Signatures" />
paket add DocWright.Signatures --version 1.1.4
#r "nuget: DocWright.Signatures, 1.1.4"
#:package DocWright.Signatures@1.1.4
#addin nuget:?package=DocWright.Signatures&version=1.1.4
#tool nuget:?package=DocWright.Signatures&version=1.1.4
DocWright.Signatures
Digital signatures for Office packages and PDFs: verify OPC package signatures with per-part results, sign a package, and add a PDF signature as an incremental update.
Add-on for DocWright.
Install
dotnet add package DocWright.Signatures
Verifying a signed package
using DocWright.Signatures;
using FileStream package = File.OpenRead("signed.docx");
PackageSignatureVerificationResult result = PackageSignatureVerifier.Verify(package);
Console.WriteLine($"signed: {result.IsSigned}, all valid: {result.AllSignaturesValid}");
foreach (PackageSignature signature in result.Signatures)
{
Console.WriteLine($"{signature.PartUri}: {signature.Status}"); // Valid, ReferenceDigestMismatch, ...
foreach (SignatureReferenceResult reference in signature.References)
{
Console.WriteLine($" {reference.Target}: {(reference.Matches ? "ok" : "FAILED")}");
}
}
Per-part results matter: they tell you which part broke a signature, not merely that something did.
Signing
Signing goes through an ISignatureProvider (or IPdfSignatureProvider for PDF) that
you implement. DocWright never holds your private key, never opens a certificate store
and never prompts — it hands your provider the bytes to sign and writes back what it
returns. That keeps HSM, KMS and smart-card scenarios possible without this package
knowing anything about them.
using DocWright.Signatures;
using FileStream source = File.OpenRead("contract.docx");
using FileStream destination = File.Create("contract-signed.docx");
PackageSigner.Sign(source, destination, myProvider, new PackageSigningOptions
{
HashAlgorithm = SignatureHashAlgorithm.Sha256,
});
A PDF is signed the same way, through PdfSigner.Sign(pdfBytes, destination, provider, options) with an IPdfSignatureProvider that returns a detached CMS signature.
Important: saving invalidates a signature
A package signature covers the content parts. Any save re-serializes those parts, so a document that was signed, then loaded and saved, comes out with a signature that is intact as bytes and invalid as a signature. That is inherent to re-writing signed content, not a defect — verify before you edit, and re-sign after.
Requirements
.NET Framework 4.8, .NET Standard 2.0, .NET 8.0 or .NET 10.0.
Documentation
📖 DocWright documentation ·
Digital signatures ·
API reference: DocWright.Signatures
Contact
Questions, support or licensing: salwan@albahadly.com · www.albahadly.com
License
MIT.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
| .NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
| .NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 is compatible. net481 was computed. |
| MonoAndroid | monoandroid was computed. |
| MonoMac | monomac was computed. |
| MonoTouch | monotouch was computed. |
| Tizen | tizen40 was computed. tizen60 was computed. |
| Xamarin.iOS | xamarinios was computed. |
| Xamarin.Mac | xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETFramework 4.8
- DocWright.Core (>= 1.1.4)
- Microsoft.Bcl.HashCode (>= 1.1.1)
- System.Buffers (>= 4.6.1)
- System.Memory (>= 4.6.3)
- System.Runtime.CompilerServices.Unsafe (>= 6.1.2)
- System.Security.Cryptography.Xml (>= 10.0.11)
-
.NETStandard 2.0
- DocWright.Core (>= 1.1.4)
- Microsoft.Bcl.HashCode (>= 1.1.1)
- System.Buffers (>= 4.6.1)
- System.Memory (>= 4.6.3)
- System.Runtime.CompilerServices.Unsafe (>= 6.1.2)
- System.Security.Cryptography.Xml (>= 10.0.11)
-
net10.0
- DocWright.Core (>= 1.1.4)
- System.Security.Cryptography.Xml (>= 10.0.11)
-
net8.0
- DocWright.Core (>= 1.1.4)
- System.Security.Cryptography.Xml (>= 10.0.11)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
Guides, tutorials and API reference: https://docs.albahadly.com/docwright/