EncDotNet.S100.ExchangeSets 0.9.0

dotnet add package EncDotNet.S100.ExchangeSets --version 0.9.0
                    
NuGet\Install-Package EncDotNet.S100.ExchangeSets -Version 0.9.0
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="EncDotNet.S100.ExchangeSets" Version="0.9.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="EncDotNet.S100.ExchangeSets" Version="0.9.0" />
                    
Directory.Packages.props
<PackageReference Include="EncDotNet.S100.ExchangeSets" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add EncDotNet.S100.ExchangeSets --version 0.9.0
                    
#r "nuget: EncDotNet.S100.ExchangeSets, 0.9.0"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package EncDotNet.S100.ExchangeSets@0.9.0
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=EncDotNet.S100.ExchangeSets&version=0.9.0
                    
Install as a Cake Addin
#tool nuget:?package=EncDotNet.S100.ExchangeSets&version=0.9.0
                    
Install as a Cake Tool

EncDotNet.S100.ExchangeSets

Reader for S-100 Exchange Set catalogues, dataset/support file discovery, and digital signature verification.

Overview

This library parses S-100 Exchange Set CATALOG.XML files and provides access to the datasets and support files within an exchange set. Key types include:

  • ExchangeSet — opens and navigates an exchange set through an IAssetSource.
  • ExchangeCatalogue — the parsed catalogue metadata.
  • ExchangeCatalogueReader — XML parser for the exchange catalogue.
  • DatasetDiscoveryMetadata — metadata for each dataset in the exchange set (file name, bounding box, product specification).
  • SupportFileDiscoveryMetadata — metadata for support files.
  • CatalogueDiscoveryMetadata — metadata for embedded catalogues.

Digital Signature Verification

The library implements the S-100 Part 15 Data Protection Scheme for signature verification. Exchange sets may include per-file digital signatures (DSA or ECDSA P-256 over SHA-256) embedded in CATALOG.XML, along with a certificate block referencing the signing data provider.

Model types

Type Description S-100 Part 15 ref
DigitalSignatureAlgorithm Enum: DSA, ECDSA §15-4.1
DigitalSignatureValue Parsed S100_SE_DigitalSignature (id, certificateRef, raw signature bytes) §15-4.2
CertificateBlock Certificate collection from the catalogue (scheme administrator ID + certificate entries) §15-5
CertificateEntry Individual X.509 certificate (id, issuer, DER-encoded bytes) §15-5.2

These are surfaced as properties on DatasetDiscoveryMetadata, SupportFileDiscoveryMetadata, CatalogueDiscoveryMetadata (via DigitalSignatureAlgorithm and DigitalSignatureValue?), and on ExchangeCatalogue (via CertificateBlock?).

Verification API

// Create a verifier
IExchangeSetVerifier verifier = new ExchangeSetVerifier();

// Configure trust anchors (optional — pass trusted SA root certificates)
var trust = new TrustAnchorOptions
{
    // For development/testing, skip certificate chain validation:
    AllowUntrustedCertificates = true,

    // For production, supply IHO SA root certificates:
    // TrustedRoots = [saRootCert],
};

// Verify an exchange set
ExchangeSetVerificationResult result = await verifier.VerifyAsync(
    assetSource,    // IAssetSource (filesystem or ZIP)
    catalogue,      // ExchangeCatalogue (from ExchangeCatalogueReader)
    trust,
    cancellationToken);

// Inspect results
if (result.IsUnsigned)
{
    // No signatures present — exchange set is unsigned
}
else if (result.AllValid)
{
    // All files have valid signatures
}
else if (result.HasInvalidSignatures)
{
    // At least one file has an invalid or untrusted signature
    foreach (var file in result.FileResults)
    {
        Console.WriteLine($"{file.FileName}: {file.Outcome} — {file.Detail}");
    }
}

Verification outcomes

VerificationOutcome Meaning
Ok Signature is valid and certificate is trusted (or trust check skipped)
NotSigned No digital signature present for this file
SignatureInvalid Signature does not match the file contents
CertificateUntrusted Signature is valid but the certificate is not trusted
CertificateExpired Certificate has expired
FileMissing Referenced file not found in the asset source
Error Unexpected error during verification

Trust anchor model

TrustAnchorOptions controls how certificate trust is evaluated:

  • TrustedRoots — a list of X509Certificate2 instances representing trusted Scheme Administrator (SA) root certificates. A signing certificate's Issuer field is matched against these roots.
  • AllowUntrustedCertificates — when true, signatures are verified for correctness but certificate chain validation is skipped. This is useful during development or when loading exchange sets from unknown sources.

The IHO publishes test SA certificates for interoperability testing. For production use, supply the official IHO SA root certificate.

Scope and limitations

  • Verification only — signing/authoring of exchange sets is not yet implemented.
  • Encryption is out of scope — Part 15 §3 Confidentiality (ENC permits, cell-level decryption) is not supported.
  • File hashing uses streaming SHA-256 to avoid loading large HDF5 files into memory.

Installation

dotnet add package EncDotNet.S100.ExchangeSets
Product Compatible and additional computed target framework versions.
.NET 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. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
0.9.0 19 5/15/2026
0.8.0 80 5/13/2026
0.7.0 76 5/12/2026
0.6.0 99 5/8/2026
0.5.0 89 5/4/2026
0.4.0 91 5/1/2026
0.3.0 89 4/29/2026
0.2.0 97 4/14/2026
0.1.2 93 4/11/2026
0.1.1 90 4/11/2026