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):
| Profiel | Land | Niveau | C14N | TSA | OCSP |
|---|---|---|---|---|---|
spEmploymentDE | Duitsland | B-LT | Exclusive | Ja | Ja |
spEmploymentIT | Italië | B-LT | C14N 1.0 | Ja | Ja |
spEmploymentES | Spanje | B-T | Exclusive | Ja | Nee |
spEmploymentFR | Frankrijk | B-T | Exclusive | Ja | Nee |
spEmploymentPL | Polen | B-T | Exclusive | Ja | Nee |
spEmploymentAT | Oostenrijk | B-LT | Exclusive | Ja | Ja |
spEmploymentBE | België | B-LT | Exclusive | Ja | Ja |
spEmploymentPT | Portugal | B-LT | Exclusive | Ja | Ja |
spEmploymentNL | Nederland | B-T | Exclusive | Ja | Nee |
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:
- GitHub Actions — composite Action met hash-only Authenticode-signing.
- Azure DevOps — native task met secure-file-integratie.
- Jenkins — declaratieve pipeline-DSL plus shared library.
- Docker — Windows Server Core-image plus een
docker-compose-bestand. - Helm — Kubernetes-chart voor een hoog-beschikbare sgcSign Server.
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.
TsgcDocumentSignerproduceert nu correct XAdES voor de AdES-profielen. Intern delegeert het naarTsgcXAdESSignervoor hetsfXAdES-pad en geeft een duidelijke fout voorsfPAdES/sfCAdES(gebruik de specifieke signers). Een nieuwe gepubliceerdeFormat: TsgcSignatureFormat-property (standaardsfXAdES) maakt de keuze expliciet. Eerdere versies stuurden ongeacht het profiel gewone XML-DSig uit, wat door nationale e-facturatiediensten werd afgewezen.TsgcPFXKeyProviderkrijgt een nieuwe gepubliceerdeHashAlgorithm-property (standaardhaSHA256), enTsgcXAdESSignerstuurt nu de hash van het actieve profiel door naar PFX-providers. FacturaeB2B-ondertekende PFX-gebackte facturen zijn nu correct RSA-SHA1, wat de afwijzing FACe INVALID_INVOICE-122 «los datos de la firma no son correctos» oplost.TsgcPFXKeyProviderondersteunt nu moderne P12-bestanden:PKCS12_PREFER_CNG_KSP, multi-cert iterate-and-probe, two-stage acquire (ONLY_NCRYPTdanPREFER_NCRYPT) en CNG-signing viaNCryptSignHash.- XAdES KSeF / ETSI-conformiteit — V1
SigningCertificate-wrapper, voorwaardelijkeSignaturePolicyIdentifier-uitvoer, decimaleX509SerialNumber, single-buildSignedProperties(fix voor clock-race), expliciete exc-c14n-transforms op deSignedProperties-reference, en een nieuweSignatureParentElement-property.TsgcSignatureVerifierresolvet nuURI=#<Id>via element-Id-lookup. - X.509-extensieparsing — de v3
[3] EXPLICIT Extensions-tag-inhoud werd dubbel ingepakt, waardoorKeyUsage,ExtendedKeyUsage, AIA, CDP, SubjectAltName en BasicConstraints op elk certificaat stilzwijgend werden overgeslagen. Opgelost. - Self-closing XML-tags —
ExtractFullElementverwerkt nu<ds:DigestMethod Algorithm="…/sha1"/>correct. Eerdere versies vielen terug op SHA-256, waardoor FacturaeB2B-verificatie brak met "Digest length mismatch for Reference 0". - Inclusive C14N-fallback —
TsgcSignatureVerifierpast impliciete inclusive C14N toe op fragment- / lege-URI-references die geen expliciete transform bevatten, conform XML-DSig §4.3.3.2. Lost "Digest value mismatch" op KeyInfo- en body-references op in inclusive-C14N-profielen (FacturaeB2B). - PEM-hardening — Unicode
ReadFileContent-fix, two-step PKCS#8-decode,AT_KEYEXCHANGEkeyspec, GUID-suffixed CSP-container, native encrypted PKCS#8 (PBES2 / PBKDF2 / AES-CBC) via BCrypt,LoadCertificateOnlyen herkenning van EC-markers. - Design-time-opruiming — alle negen signer- / verifier-componenten wissen nu automatisch gekoppelde references via
Notification(opRemove), waardoor dangling pointers worden geëlimineerd wanneer een key provider of TSA-client uit het form wordt verwijderd. - Build-hygiëne — W1000 (UTF8Decode) in
sgcSign_ASiCopgelost via een{$IFDEF UNICODE} UTF8ToString-fallback; H2077- / H2219-dode-code-waarschuwingen opgeschoond insgcSign_XAdESensgcSign_TrustList.
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.
