Un mois seulement apres le lancement initial, sgcSign 2026.5 apporte une extension majeure de la bibliotheque. Cette version ajoute la signature Microsoft Authenticode pour les binaires Windows, trois nouveaux signataires de distribution de code (ClickOnce, NuGet, VSIX), un pack complet de conformite eIDAS UE (conteneurs ASiC, liste de confiance LOTL / EUTL, signature a distance Cloud Signature Consortium), neuf profils d'emploi nationaux pre-configures, un profil bulgare Peppol BIS Billing 3.0, un generateur natif de QR Code, la prise en charge d'ECDSA P-256/384/521 plus RSA-PSS, des integrations CI/CD completes, ainsi qu'un ensemble etendu de corrections de conformite XAdES / PFX.
Cet article presente les points forts, avec des extraits Delphi prets a coller pour chaque nouveau composant.
Microsoft Authenticode
TsgcAuthenticodeSigner signe les fichiers Windows Portable Executable (.exe, .dll, .sys) conformement a la specification Authenticode. Le signataire analyse le PE, calcule son empreinte avec l'algorithme Authenticode (en ignorant la somme de controle et la table de certificats existante), construit un blob PKCS#7 SignedData complet avec le contenu indirect SPC, et l'ajoute a la table de certificats du binaire.
Les empreintes de SHA-1 a SHA-512 sont prises en charge, les horodatages RFC 3161 sont integres en tant qu'attributs non signes, et AppendSignature := True produit des signatures imbriquees (par exemple, double signature SHA-1 + SHA-256 pour la compatibilite avec les anciens Windows).
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;
La verification est symetrique. TsgcAuthenticodeVerifier.Verify retourne un enregistrement avec le resultat, les empreintes calculee et integree, le sujet/emetteur du signataire, et la presence ou non d'un horodatage :
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;
Signature Authenticode par empreinte uniquement
Les artefacts CI volumineux (installateurs, runtimes, pilotes) rendent penible le televersement du PE complet vers un signataire distant. Le nouveau flux de signature par empreinte uniquement permet au client de calculer localement l'empreinte Authenticode et de n'envoyer que le condense de 32 octets au serveur sgcSign. Le serveur renvoie le blob PKCS#7 non attache, et le client le reintegre dans le binaire — reduisant les televersements de plusieurs megaoctets a quelques kilo-octets sur les agents a bande passante limitee.
// 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;
La meme operation est exposee par le point de terminaison POST /api/v1/sign/authenticode/hash du serveur, par l'indicateur CLI sgcsign sign --prehash, et par la methode TsgcSignClient.SignAuthenticodeHashAsync du SDK .NET.
Signataires ClickOnce, NuGet et VSIX
Trois nouveaux signataires couvrent l'ecosysteme de distribution pour developpeurs Microsoft.
TsgcClickOnceSigner signe les manifestes de deploiement .application et les manifestes d'application .exe.manifest a l'aide de XML-DSig W3C enveloppe, correspondant a la sortie de mage.exe de Microsoft. Le signataire reecrit le noeud publisherIdentity avec l'issuerKeyHash du certificat.
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 signe les packages d'auteur .nupkg, produisant un blob CMS/PKCS#7 SignedData (certificat de signature v2, type d'engagement « proof of origin ») avec une contre-signature RFC 3161 optionnelle.
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 implemente les signatures numeriques OPC (Open Packaging Convention) pour les extensions Visual Studio, calculant les references XML-DSig par partie et reecrivant [Content_Types].xml et le _rels/.rels du package.
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;
Tous les trois reutilisent la meme interface IsgcKeyProvider que les signataires XAdES / PAdES / CAdES existants, ce qui permet de reutiliser un AWS KMS, Azure Trusted Signing ou un jeton PKCS#11 configure pour la signature de factures pour la signature de binaires sans plomberie supplementaire.
Pack de conformite eIDAS UE
Cette version introduit le pack eIDAS — trois nouvelles unites qui, ensemble, permettent a une application Delphi de valider une signature par rapport au cadre de confiance officiel de l'UE et de produire des conteneurs d'archivage a long terme.
Conteneurs ASiC (ETSI EN 319 162-1)
sgcSign_ASiC construit et analyse des conteneurs ASiC-S (document unique) et ASiC-E (plusieurs documents) dans les variantes XAdES et CAdES. La sortie est un ZIP deterministe avec l'entree mimetype en premier et la signature placee sous 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;
Liste de confiance LOTL / EUTL
sgcSign_TrustList telecharge la List of Trusted Lists de l'UE, suit les pointeurs de liste de confiance par Etat membre, et analyse chaque entree TSPService. Le resultat est un catalogue en memoire d'environ 3 600 services repartis dans 31 Etats membres. La recherche IsQualifiedAtTime classe tout certificat comme « emis par un TSP qualifie » a une heure de signature donnee — l'operation necessaire pour faire passer une signature d'avancee (AdES) a qualifiee (QES) selon l'article 25 du reglement eIDAS.
Cloud Signature Consortium (CSC v2)
TsgcCSCKeyProvider est une implementation d'IsgcKeyProvider pour l'API Cloud Signature Consortium v2 — la norme europeenne pour la signature qualifiee a distance utilisee par Buypass, Certinomis, Globalsign EU, InfoCert, Namirial, Trust Pro et d'autres QTSP. Le fournisseur gere l'authentification Basic / OAuth2 / OTP, liste les identifiants de l'utilisateur, recupere la chaine de certificats et effectue la signature a distance par empreinte uniquement en utilisant l'autorisation SAD.
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;
Neuf profils d'emploi
Neuf profils pre-configures ciblent les documents de droit du travail europeens (contrats de travail, fiches de paie, conventions de transfert) :
| Profil | Pays | Niveau | C14N | TSA | OCSP |
|---|---|---|---|---|---|
spEmploymentDE | Allemagne | B-LT | Exclusif | Oui | Oui |
spEmploymentIT | Italie | B-LT | C14N 1.0 | Oui | Oui |
spEmploymentES | Espagne | B-T | Exclusif | Oui | Non |
spEmploymentFR | France | B-T | Exclusif | Oui | Non |
spEmploymentPL | Pologne | B-T | Exclusif | Oui | Non |
spEmploymentAT | Autriche | B-LT | Exclusif | Oui | Oui |
spEmploymentBE | Belgique | B-LT | Exclusif | Oui | Oui |
spEmploymentPT | Portugal | B-LT | Exclusif | Oui | Oui |
spEmploymentNL | Pays-Bas | B-T | Exclusif | Oui | Non |
Une nouvelle demo EU_Employment fournit le pipeline complet (signature → emballage ASiC-E → verification LOTL → classification QTSP).
Peppol BIS Billing 3.0 bulgare
Le nouveau profil TsgcProfilePeppolBG signe les factures UBL 2.1 bulgares (devise BGN, TVA a 20 %, TVA / EIK BG, IBAN BG, point de terminaison scheme ID 9926) en XAdES B-T avec C14N exclusif. Les demos Delphi et C++Builder fournissent un modele de facture entierement renseigne.
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;
Integrations CI/CD
Le serveur sgcSign fournit desormais des artefacts de premier ordre pour chaque pipeline courant :
- GitHub Actions — Action composite avec signature Authenticode par empreinte uniquement.
- Azure DevOps — tache native avec integration de fichiers securises.
- Jenkins — DSL de pipeline declaratif plus bibliotheque partagee.
- Docker — image Windows Server Core plus un fichier
docker-compose. - Helm — chart Kubernetes pour un serveur sgcSign a haute disponibilite.
Generateur de QR Code
Pour TicketBAI, VeriFactu et les profils similaires qui necessitent un QR code sur la facture imprimable, la nouvelle unite sgcSign_QRCode fournit un generateur en Pascal pur implementant ISO/IEC 18004 en mode octet — les quatre niveaux ECC, versions 1 a 40, Reed-Solomon GF(256), notation complete des penalites de masque — avec un moteur de rendu TBitmap. Aucune DLL externe, aucune surprise de licence.
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 et RSA-PSS
TsgcPEMKeyProvider importe desormais les cles privees EC via Windows BCrypt CNG (ECCPRIVATEBLOB) et signe avec une sortie brute r||s pour XML-DSig. Une nouvelle methode SignDataPSS produit des signatures RSA-PSS (SHA-256, sel = 32 octets) en utilisant BCRYPT_PAD_PSS — requis par un nombre croissant de profils nationaux de facturation electronique.
Du cote de la verification, TsgcSignatureVerifier importe les cles publiques EC depuis BCRYPT_ECCPUBLIC_BLOB et valide les signatures ECDSA pour les memes trois courbes, a la fois dans le SignatureValue XAdES et dans les chemins de code VerifyData bruts.
Pour rendre cela possible, TsgcX509Certificate analyse desormais l'extension KeyUsage et l'expose via la propriete KeyUsage plus les fonctions d'aide HasKeyUsageDigitalSignature / HasKeyUsageNonRepudiation, et la nouvelle propriete PublicKeyParameters expose le TLV brut des parametres AlgorithmIdentifier (l'OID de courbe nommee pour les certificats EC).
Surcharges WideString pour Delphi 7
Pour les appelants transmettant du texte hors-ACP (KSeF polonais, myDATA grec, Peppol bulgare, etc.), l'API publique de signature et de verification expose desormais des surcharges WideString sur TsgcXAdESSigner.SignXML, SignXMLDetached, SignXMLEnveloping (et les methodes correspondantes sur TsgcDocumentSigner et TsgcSignatureVerifier). Cela garantit un Unicode sans perte en entree/sortie sur Delphi 7 — sans aller-retour ACP — et est equivalent aux surcharges string sur Delphi 2009+.
Corrections de conformite et de fiabilite
Le lot de corrections de bogues de la version 2026.5 cloture une longue liste de problemes XAdES / PFX / verificateur decouverts face a des points de terminaison reels d'autorites fiscales.
TsgcDocumentSignerproduit desormais correctement du XAdES pour les profils AdES. En interne, il delegue aTsgcXAdESSignerpour le cheminsfXAdES, et leve une erreur claire poursfPAdES/sfCAdES(utilisez les signataires dedies). Une nouvelle propriete publieeFormat: TsgcSignatureFormat(par defautsfXAdES) rend le choix explicite. Les versions precedentes emettaient du XML-DSig simple independamment du profil, ce que les services nationaux de facturation electronique rejetaient.TsgcPFXKeyProviderobtient une nouvelle propriete publieeHashAlgorithm(par defauthaSHA256), etTsgcXAdESSignerpousse desormais l'empreinte du profil actif vers les fournisseurs PFX. Les factures FacturaeB2B signees avec un PFX sont maintenant correctement en RSA-SHA1, corrigeant le rejet FACe INVALID_INVOICE-122 «los datos de la firma no son correctos».TsgcPFXKeyProviderprend desormais en charge les fichiers P12 modernes :PKCS12_PREFER_CNG_KSP, iteration et sondage multi-certificats, acquisition en deux etapes (ONLY_NCRYPTpuisPREFER_NCRYPT) et signature CNG viaNCryptSignHash.- Conformite XAdES KSeF / ETSI — wrapper
SigningCertificateV1, emission conditionnelle deSignaturePolicyIdentifier,X509SerialNumberdecimal, construction unique deSignedProperties(correction de course d'horloge), transformations exc-c14n explicites sur la referenceSignedProperties, et nouvelle proprieteSignatureParentElement.TsgcSignatureVerifierresout desormaisURI=#<Id>par recherche d'Id d'element. - Analyse des extensions X.509 — le contenu de la balise v3
[3] EXPLICIT Extensionsetait doublement encapsule, sautant silencieusementKeyUsage,ExtendedKeyUsage, AIA, CDP, SubjectAltName et BasicConstraints sur chaque certificat. Corrige. - Balises XML auto-fermantes —
ExtractFullElementgere desormais correctement<ds:DigestMethod Algorithm="…/sha1"/>. Les versions precedentes basculaient par defaut sur SHA-256, cassant la verification FacturaeB2B avec « Digest length mismatch for Reference 0 ». - Repli C14N inclusif —
TsgcSignatureVerifierapplique le C14N inclusif implicite aux references de fragment / URI vide qui omettent une transformation explicite, conformement a XML-DSig §4.3.3.2. Corrige le « Digest value mismatch » sur les references KeyInfo et body dans les profils a C14N inclusif (FacturaeB2B). - Durcissement PEM — correction Unicode de
ReadFileContent, decodage PKCS#8 en deux etapes, keyspecAT_KEYEXCHANGE, conteneur CSP suffixe par GUID, PKCS#8 chiffre natif (PBES2 / PBKDF2 / AES-CBC) via BCrypt,LoadCertificateOnlyet reconnaissance du marqueur EC. - Hygiene au moment de la conception — les neuf composants signataires / verificateurs effacent desormais automatiquement les references liees via
Notification(opRemove), eliminant les pointeurs pendants lorsqu'un fournisseur de cle ou un client TSA est supprime du formulaire. - Hygiene de compilation — W1000 (UTF8Decode) dans
sgcSign_ASiCcorrige via un repli{$IFDEF UNICODE} UTF8ToString; avertissements de code mort H2077 / H2219 nettoyes danssgcSign_XAdESetsgcSign_TrustList.
Mise a niveau
La version 2026.5 est une mise a niveau directe pour les projets 2026.4 existants. Le seul changement comportemental a surveiller concerne TsgcDocumentSigner : le code qui s'appuyait sur l'emission de XML-DSig simple pour les profils AdES produira desormais correctement du XAdES — c'est ce que les autorites fiscales ont demande, mais si votre test d'integration etait fige sur la sortie heritee, vous devrez actualiser les fichiers de reference.
Les clients disposant d'un abonnement actif peuvent telecharger la nouvelle version depuis l'espace client. Les utilisateurs d'evaluation peuvent recuperer l'installateur mis a jour sur esegece.com/products/sgcsign/sgcsign-download.
Des questions, des commentaires ou besoin d'aide pour la migration ? Contactez-nous — vous recevrez une reponse des personnes qui ont ecrit le code.
