sgcSign 2026.5 — Authenticode, EU eIDAS Pack & 9 arbeidsprofielen

· Releases

Slechts een maand na de eerste lancering brengt sgcSign 2026.5 een grote uitbreiding van de bibliotheek. Deze release voegt Microsoft Authenticode-signing toe voor Windows-binaries, drie nieuwe signers voor codedistributie (ClickOnce, NuGet, VSIX), een volledig EU eIDAS compliance pack (ASiC-containers, LOTL / EUTL-vertrouwenslijst, Cloud Signature Consortium remote signing), negen vooraf afgestemde landenspecifieke arbeidsprofielen, een Bulgaars Peppol BIS Billing 3.0-profiel, een ingebouwde QR Code generator, ondersteuning voor ECDSA P-256/384/521 plus RSA-PSS, volledige CI/CD-integraties en een uitgebreide set XAdES / PFX conformiteits-fixes.

Dit bericht doorloopt de hoogtepunten, met kant-en-klaar te plakken Delphi-snippets voor elke nieuwe component.

Microsoft Authenticode

TsgcAuthenticodeSigner ondertekent Windows Portable Executable-bestanden (.exe, .dll, .sys) volgens de Authenticode-specificatie. De signer parseert de PE, hasht deze met het Authenticode-algoritme (waarbij de checksum en de bestaande certificate table worden overgeslagen), bouwt een volledige PKCS#7 SignedData-blob met de SPC indirect data content en voegt deze toe aan de certificate table van de binary.

Hashes van SHA-1 tot en met SHA-512 worden ondersteund, RFC 3161-timestamps worden ingebed als unsigned attributes en AppendSignature := True produceert geneste handtekeningen (bijv. SHA-1 + SHA-256 dual signing voor compatibiliteit met oudere Windows-versies).

uses
  sgcSign_Authenticode, sgcSign_KeyProvider_PFX, sgcSign_TSAClient;

var
  oSigner: TsgcAuthenticodeSigner;
  oPFX: TsgcPFXKeyProvider;
  oTSA: TsgcTSAClient;
begin
  oPFX := TsgcPFXKeyProvider.Create(nil);
  oPFX.FileName := 'codesign.pfx';
  oPFX.Password := 'secret';

  oTSA := TsgcTSAClient.Create(nil);
  oTSA.URL := 'http://timestamp.digicert.com';

  oSigner := TsgcAuthenticodeSigner.Create(nil);
  try
    oSigner.KeyProvider := oPFX;
    oSigner.TSAClient   := oTSA;
    oSigner.Hash        := ahSHA256;     // ahSHA1 / ahSHA256 / ahSHA384 / ahSHA512
    oSigner.Level       := alT;          // alBES or alT (with timestamp)
    oSigner.Description := 'My Application';
    oSigner.URL         := 'https://www.example.com';
    oSigner.SignFile('MyApp.exe', 'MyApp-signed.exe');
  finally
    oSigner.Free; oTSA.Free; oPFX.Free;
  end;
end;

Verificatie is symmetrisch. TsgcAuthenticodeVerifier.Verify geeft een record terug met het resultaat, de berekende en ingebedde hashes, het subject/issuer van de ondertekenaar en of er een timestamp aanwezig is:

var
  oVer: TsgcAuthenticodeVerifier;
  oRes: TsgcAuthenticodeVerifyResult;
begin
  oVer := TsgcAuthenticodeVerifier.Create(nil);
  try
    oRes := oVer.Verify('MyApp-signed.exe');
    if oRes.Valid then
      ShowMessage('Signed by ' + oRes.SubjectName)
    else
      ShowMessage('Invalid: ' + oRes.ErrorMessage);
  finally
    oVer.Free;
  end;
end;

Authenticode-signing met alleen de hash

Grote CI-artefacten (installers, runtimes, drivers) maken het uploaden van de volledige PE naar een remote signer pijnlijk. Met de nieuwe hash-only signing flow kan de client de Authenticode-hash lokaal berekenen en alleen de 32-byte digest naar de sgcSign Server sturen. De server retourneert de losse PKCS#7-blob, en de client integreert deze terug in de binary — waardoor uploads van meerdere megabytes worden teruggebracht tot een paar KB op agents met beperkte bandbreedte.

// Local: compute the hash with sgcSign_PE_Hasher, POST it to the server,
// receive the SignedData blob, then append it to the PE's certificate table.
var
  oSigner: TsgcAuthenticodeSigner;
  vHash, vPKCS7: TBytes;
begin
  // vHash := ComputePEHash('MyApp.exe', haSHA256);
  vPKCS7 := oSigner.SignHash(vHash, ahSHA256);
  // EmbedPKCS7IntoPE('MyApp.exe', vPKCS7, 'MyApp-signed.exe');
end;

Dezelfde bewerking wordt aangeboden door het POST /api/v1/sign/authenticode/hash-endpoint van de server, de CLI-vlag sgcsign sign --prehash en de methode TsgcSignClient.SignAuthenticodeHashAsync op de .NET SDK.

ClickOnce-, NuGet- en VSIX-signers

Drie nieuwe signers dekken het Microsoft developer-distributie-ecosysteem.

TsgcClickOnceSigner ondertekent .application deployment-manifesten en .exe.manifest applicatie-manifesten met enveloped W3C XML-DSig, overeenkomend met de output van Microsoft mage.exe. De signer herschrijft de publisherIdentity-node met de issuerKeyHash van het certificaat.

uses sgcSign_ClickOnce;

var oCO: TsgcClickOnceSigner;
begin
  oCO := TsgcClickOnceSigner.Create(nil);
  try
    oCO.KeyProvider   := oPFX;
    oCO.Hash          := haSHA256;
    oCO.PublisherName := 'My Company';
    oCO.SignManifestFile('MyApp.application', 'MyApp-signed.application');
  finally
    oCO.Free;
  end;
end;

TsgcNuGetSigner ondertekent .nupkg author-packages en produceert een CMS/PKCS#7 SignedData-blob (signing certificate v2, commitment-type "proof of origin") met een optionele RFC 3161-countersignature.

uses sgcSign_NuGet;

var oNu: TsgcNuGetSigner;
begin
  oNu := TsgcNuGetSigner.Create(nil);
  try
    oNu.KeyProvider := oPFX;
    oNu.TSAClient   := oTSA;
    oNu.Hash        := haSHA256;
    oNu.SignPackageFile('MyLib.1.0.0.nupkg', 'MyLib.1.0.0.signed.nupkg');
  finally
    oNu.Free;
  end;
end;

TsgcVSIXSigner implementeert OPC (Open Packaging Convention) digitale handtekeningen voor Visual Studio-extensies, berekent per-part XML-DSig references en herschrijft [Content_Types].xml en de package _rels/.rels.

uses sgcSign_VSIX;

var oVX: TsgcVSIXSigner;
begin
  oVX := TsgcVSIXSigner.Create(nil);
  try
    oVX.KeyProvider := oPFX;
    oVX.Hash        := haSHA256;
    oVX.SignPackageFile('MyExt.vsix', 'MyExt-signed.vsix');
  finally
    oVX.Free;
  end;
end;

Alle drie hergebruiken dezelfde IsgcKeyProvider-interface als de bestaande XAdES / PAdES / CAdES signers, zodat een AWS KMS, Azure Trusted Signing of PKCS#11-token die voor facturatie-signing is geconfigureerd, zonder extra inspanning kan worden hergebruikt voor binary signing.

EU eIDAS / compliance pack

Deze release introduceert het eIDAS-pack — drie nieuwe units waarmee een Delphi-applicatie een handtekening kan valideren tegen het officiële EU-vertrouwensraamwerk en archiefcontainers voor de lange termijn kan produceren.

ASiC-containers (ETSI EN 319 162-1)

sgcSign_ASiC bouwt en parseert ASiC-S (enkel document) en ASiC-E (meerdere documenten) containers in zowel XAdES- als CAdES-varianten. De output is een deterministische ZIP met de mimetype-entry vooraan en de handtekening onder META-INF/.

uses sgcSign_ASiC;

var
  oDocs: TsgcASiCDocumentArray;
  vBytes: TBytes;
begin
  SetLength(oDocs, 1);
  oDocs[0].Name := 'invoice.xml';
  oDocs[0].Data := TFile.ReadAllBytes('invoice.xml');

  // aSignatureXML comes from TsgcXAdESSigner (detached signature over the doc)
  vBytes := TsgcASiCContainer.BuildXAdES(apASiCE, oDocs, vXAdESSignature);
  TFile.WriteAllBytes('invoice.asice', vBytes);
end;

LOTL / EUTL-vertrouwenslijst

sgcSign_TrustList downloadt de EU List of Trusted Lists, volgt de vertrouwenslijst-verwijzingen per lidstaat en parseert elke TSPService-entry. Het resultaat is een in-memory catalogus van ~3.600 diensten verspreid over 31 lidstaten. De IsQualifiedAtTime-lookup classificeert elk certificaat als "uitgegeven door een Qualified TSP" op een bepaald ondertekeningstijdstip — de operatie die nodig is om een handtekening op te waarderen van geavanceerd (AdES) naar gekwalificeerd (QES) onder eIDAS artikel 25.

Cloud Signature Consortium (CSC v2)

TsgcCSCKeyProvider is een IsgcKeyProvider-implementatie voor de Cloud Signature Consortium API v2 — de Europese standaard voor remote qualified signing die wordt gebruikt door Buypass, Certinomis, Globalsign EU, InfoCert, Namirial, Trust Pro en andere QTSP's. De provider handelt Basic / OAuth2 / OTP-authenticatie af, toont de credentials van de gebruiker, haalt de certificaatketen op en voert hash-only remote signing uit met SAD-autorisatie.

uses sgcSign_KeyProvider_CSC, sgcSign_XAdES;

var oCSC: TsgcCSCKeyProvider; oX: TsgcXAdESSigner;
begin
  oCSC := TsgcCSCKeyProvider.Create(nil);
  oCSC.BaseURL    := 'https://csc.example-qtsp.eu/csc/v2';
  oCSC.AuthMethod := cscOAuth2;
  oCSC.OAuthClientID     := 'my-client-id';
  oCSC.OAuthClientSecret := 'my-client-secret';
  oCSC.CredentialID      := oCSC.ListCredentials[0];
  oCSC.PIN := '1234';
  oCSC.OTP := '987654';      // pushed via SMS / app
  oCSC.LoadCredentialInfo;

  oX := TsgcXAdESSigner.Create(nil);
  oX.KeyProvider := oCSC;
  oX.Profile     := spEIDAS;
  oX.SignXML(vXML);
end;

Negen arbeidsprofielen

Negen vooraf afgestemde profielen richten zich op Europese arbeidsrechtelijke documenten (arbeidscontracten, loonstroken, overdrachtsovereenkomsten):

ProfielLandNiveauC14NTSAOCSP
spEmploymentDEDuitslandB-LTExclusiveJaJa
spEmploymentITItaliëB-LTC14N 1.0JaJa
spEmploymentESSpanjeB-TExclusiveJaNee
spEmploymentFRFrankrijkB-TExclusiveJaNee
spEmploymentPLPolenB-TExclusiveJaNee
spEmploymentATOostenrijkB-LTExclusiveJaJa
spEmploymentBEBelgiëB-LTExclusiveJaJa
spEmploymentPTPortugalB-LTExclusiveJaJa
spEmploymentNLNederlandB-TExclusiveJaNee

Een nieuwe EU_Employment-demo levert de volledige pipeline (signen → ASiC-E-package → LOTL-verificatie → QTSP-classificatie).

Bulgaars Peppol BIS Billing 3.0

Het nieuwe TsgcProfilePeppolBG-profiel ondertekent Bulgaarse UBL 2.1-facturen (BGN-valuta, 20% btw, BG VAT / EIK, BG IBAN, scheme ID 9926 endpoint) op XAdES B-T met exclusive C14N. De Delphi- en C++Builder-demo's bevatten een volledig ingevulde factuursjabloon.

uses sgcSign_XAdES, sgcSign_Types;

var oSigner: TsgcXAdESSigner;
begin
  oSigner := TsgcXAdESSigner.Create(nil);
  try
    oSigner.KeyProvider := oPFX;
    oSigner.TSAClient   := oTSA;
    oSigner.Profile     := spPeppolBG;
    oSigner.SignXMLFile('invoice_bg.xml', 'invoice_bg_signed.xml');
  finally
    oSigner.Free;
  end;
end;

CI/CD-integraties

sgcSign Server levert nu eersteklas artefacten voor elke gangbare pipeline:

QR Code generator

Voor TicketBAI, VeriFactu en vergelijkbare profielen die een QR-code op de afdrukbare factuur vereisen, levert de nieuwe sgcSign_QRCode-unit een pure-Pascal-generator die ISO/IEC 18004 in byte-mode implementeert — alle vier ECC-niveaus, versies 1 tot en met 40, GF(256) Reed-Solomon, volledige mask-penalty scoring — met een TBitmap-renderer. Geen externe DLL, geen verrassingen met licenties.

uses sgcSign_QRCode, Graphics;

var
  oMatrix: TQRMatrix;
  oBmp: TBitmap;
begin
  oMatrix := GenerateQRCode(
    'https://tbai.eus/QURL/123456789-A?cr=42',
    qrECM);

  oBmp := TBitmap.Create;
  try
    RenderQRMatrix(oMatrix, oBmp, 5, 4);    // 5 px / module, 4-module border
    oBmp.SaveToFile('invoice_qr.bmp');
  finally
    oBmp.Free;
  end;
end;

ECDSA P-256 / P-384 / P-521 en RSA-PSS

TsgcPEMKeyProvider importeert nu EC private keys via Windows BCrypt CNG (ECCPRIVATEBLOB) en ondertekent met rauwe r||s-output voor XML-DSig. Een nieuwe SignDataPSS-methode produceert RSA-PSS-handtekeningen (SHA-256, salt = 32 bytes) met behulp van BCRYPT_PAD_PSS — vereist door een toenemend aantal nationale e-facturatieprofielen.

Aan de verificatiekant importeert TsgcSignatureVerifier EC public keys uit BCRYPT_ECCPUBLIC_BLOB en valideert ECDSA-handtekeningen voor diezelfde drie curves, zowel in de XAdES SignatureValue als in de rauwe VerifyData-codepaden.

Om dit mogelijk te maken parseert TsgcX509Certificate nu de KeyUsage-extensie en stelt deze beschikbaar via de KeyUsage-property plus de helpers HasKeyUsageDigitalSignature / HasKeyUsageNonRepudiation, en de nieuwe PublicKeyParameters-property stelt de rauwe AlgorithmIdentifier-parameters-TLV beschikbaar (de named-curve OID voor EC-certificaten).

WideString-overloads voor Delphi 7

Voor aanroepers die niet-ACP-tekst doorgeven (Pools KSeF, Grieks myDATA, Bulgaars Peppol, enz.) biedt de publieke signing- en verificatie-API nu WideString-overloads op TsgcXAdESSigner.SignXML, SignXMLDetached, SignXMLEnveloping (en de bijbehorende methoden op TsgcDocumentSigner en TsgcSignatureVerifier). Dit garandeert verliesvrije Unicode in en uit op Delphi 7 — geen ACP round-trip — en is equivalent aan de string-overloads op Delphi 2009+.

Conformiteits- en betrouwbaarheidsfixes

De bugfix-batch in 2026.5 sluit een lange lijst van XAdES- / PFX- / verifier-problemen af die werden ontdekt tegen live endpoints van belastingdiensten.

Upgraden

2026.5 is een drop-in-upgrade voor bestaande 2026.4-projecten. De enige gedragsverandering om op te letten betreft TsgcDocumentSigner: code die erop vertrouwde dat dit gewone XML-DSig uitstuurde voor de AdES-profielen, zal nu correct XAdES produceren — dat is wat de belastingdiensten hebben gevraagd, maar als uw integratietest was vastgelegd op de oude output, moet u de golden files vernieuwen.

Klanten met een actief abonnement kunnen de nieuwe build downloaden uit het klantengebied. Trialgebruikers kunnen de bijgewerkte installer ophalen op esegece.com/products/sgcsign/sgcsign-download.

Vragen, feedback of hulp bij migratie? Neem contact op — u krijgt een antwoord van de mensen die de code hebben geschreven.