X509ChainExtensions

Namespace: WvdS.System.Security.Cryptography.X509Certificates

Drop-in replacement extensions for X509Chain with post-quantum signature validation. Extends the standard chain validation with PQ signature checking in all three crypto modes.

Methods

Method Description
Build(certificate, mode) Builds and validates the certificate chain with CryptoMode
Build(certificate, customTrustStore, mode) Chain validation with custom trust store
Build(certificate, trustStore, mode) Chain validation with PqTrustStore
BuildWithRevocationCheck(…) Chain build with CRL/OCSP checking
BuildWithOfflineCrl(…) Chain build with offline CRL data
IsFullyPqProtected() Checks if entire chain is PQ protected
GetChainCryptoModes() Returns CryptoModes of all chain elements
GetValidationReport() Creates detailed validation report

Build with CryptoMode

using var chain = new X509Chain();
var cert = new X509Certificate2("certificate.pfx");
 
// With explicit CryptoMode
bool isValid = chain.Build(cert, CryptoMode.Hybrid);
 
// With default mode from CryptoConfig
bool isValid2 = chain.Build(cert, null);

Validation Behavior by Mode

Mode Classical Signature PQ Signature
Classic Verified Ignored
Hybrid Verified Verified (if present)
PostQuantum Verified (structure) Required

Build with Custom Trust Store

// With X509Certificate2Collection
var trustAnchors = new X509Certificate2Collection();
trustAnchors.Add(rootCa);
 
using var chain = new X509Chain();
bool isValid = chain.Build(cert, trustAnchors, CryptoMode.Hybrid);
 
// With PqTrustStore
var trustStore = PqTrustStore.LoadFromPem("truststore.pem");
bool isValid2 = chain.Build(cert, trustStore, CryptoMode.Hybrid);

BuildWithRevocationCheck

using var chain = new X509Chain();
bool isValid = chain.BuildWithRevocationCheck(
    certificate,
    customTrustStore,
    X509RevocationMode.Online,  // or Offline
    CryptoMode.Hybrid);

BuildWithOfflineCrl

For air-gapped environments or when CRL download is not possible:

// Load CRLs
var crlData = new List<byte[]>
{
    File.ReadAllBytes("root-ca.crl"),
    File.ReadAllBytes("intermediate-ca.crl")
};
 
using var chain = new X509Chain();
bool isValid = chain.BuildWithOfflineCrl(
    certificate,
    customTrustStore,
    crlData,
    CryptoMode.Hybrid);

IsFullyPqProtected

using var chain = new X509Chain();
chain.Build(cert, CryptoMode.Hybrid);
 
if (chain.IsFullyPqProtected())
{
    Console.WriteLine("Entire chain is PQ protected");
}
else
{
    // Which certificates are not PQ protected?
    var modes = chain.GetChainCryptoModes();
    for (int i = 0; i < modes.Length; i++)
    {
        if (modes[i] == CryptoMode.Classic)
        {
            Console.WriteLine($"Element {i} has no PQ protection");
        }
    }
}

GetValidationReport

Creates a detailed report about chain validation:

using var chain = new X509Chain();
chain.Build(cert, CryptoMode.Hybrid);
 
var report = chain.GetValidationReport();
Console.WriteLine(report.ToString());
 
// Individual properties:
Console.WriteLine($"Valid: {report.IsValid}");
Console.WriteLine($"Chain length: {report.ChainLength}");
Console.WriteLine($"Fully PQ protected: {report.IsFullyPqProtected}");
 
// Details per element:
foreach (var element in report.Elements)
{
    Console.WriteLine($"  {element.Subject}");
    Console.WriteLine($"    Mode: {element.CryptoMode}");
    Console.WriteLine($"    Has PQ keys: {element.HasPqKeys}");
}

ChainValidationReport

Property Type Description
IsValid bool Chain is valid
ChainLength int Number of chain elements
IsFullyPqProtected bool All certificates are PQ protected
OverallStatus X509ChainStatusFlags[] Overall status
Elements ChainElementInfo[] Details per element

ChainElementInfo

Property Type Description
Subject string Certificate subject
Issuer string Issuer
Thumbprint string SHA-1 fingerprint
NotBefore DateTime Valid from
NotAfter DateTime Valid until
CryptoMode CryptoMode Detected mode
HasPqKeys bool PQ keys in store
StatusFlags X509ChainStatusFlags[] Status flags
StatusMessages string[] Status messages

See Also


Wolfgang van der Stille @ EMSR DATA d.o.o. - Post-Quantum Cryptography Professional

Zuletzt geändert: on 2026/01/30 at 12:18 AM