sgcSign 2026.5 — Authenticode, pack eIDAS UE et 9 profils d'emploi

· Versions

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) :

ProfilPaysNiveauC14NTSAOCSP
spEmploymentDEAllemagneB-LTExclusifOuiOui
spEmploymentITItalieB-LTC14N 1.0OuiOui
spEmploymentESEspagneB-TExclusifOuiNon
spEmploymentFRFranceB-TExclusifOuiNon
spEmploymentPLPologneB-TExclusifOuiNon
spEmploymentATAutricheB-LTExclusifOuiOui
spEmploymentBEBelgiqueB-LTExclusifOuiOui
spEmploymentPTPortugalB-LTExclusifOuiOui
spEmploymentNLPays-BasB-TExclusifOuiNon

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 :

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.

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.