sgcSign 2026.5 — Authenticode, pack eIDAS de la UE y 9 perfiles laborales

· Versiones

Apenas un mes después del lanzamiento inicial, sgcSign 2026.5 presenta una importante ampliación de la biblioteca. Esta versión añade firma Microsoft Authenticode para binarios de Windows, tres nuevos firmadores de distribución de código (ClickOnce, NuGet, VSIX), un completo pack de cumplimiento eIDAS de la UE (contenedores ASiC, lista de confianza LOTL / EUTL, firma remota Cloud Signature Consortium), nueve perfiles laborales por país preconfigurados, un perfil búlgaro Peppol BIS Billing 3.0, un generador nativo de códigos QR, soporte de ECDSA P-256/384/521 y RSA-PSS, integraciones CI/CD completas, y un amplio conjunto de correcciones de conformidad XAdES / PFX.

Esta entrada repasa las novedades destacadas, con fragmentos de Delphi listos para pegar para cada nuevo componente.

Microsoft Authenticode

TsgcAuthenticodeSigner firma archivos Portable Executable de Windows (.exe, .dll, .sys) según la especificación Authenticode. El firmador analiza el PE, lo hashea con el algoritmo Authenticode (omitiendo el checksum y la tabla de certificados existente), construye un blob PKCS#7 SignedData completo con el contenido SPC indirect data y lo añade a la tabla de certificados del binario.

Se admiten hashes desde SHA-1 hasta SHA-512, los sellos de tiempo RFC 3161 se incrustan como atributos no firmados, y AppendSignature := True produce firmas anidadas (p. ej. doble firma SHA-1 + SHA-256 para compatibilidad con Windows antiguos).

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 verificación es simétrica. TsgcAuthenticodeVerifier.Verify devuelve un registro con el resultado, los hashes calculado e incrustado, el sujeto/emisor del firmante y si hay un sello de tiempo presente:

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;

Firma Authenticode solo por hash

Los grandes artefactos de CI (instaladores, runtimes, controladores) hacen que subir el PE completo a un firmador remoto sea engorroso. El nuevo flujo de firma solo por hash permite al cliente calcular localmente el hash Authenticode y enviar únicamente el resumen de 32 bytes al servidor sgcSign. El servidor devuelve el blob PKCS#7 no adjunto, y el cliente lo incrusta de nuevo en el binario — reduciendo subidas de varios megabytes a unos pocos KB en agentes con ancho de banda limitado.

// 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 misma operación se expone a través del endpoint POST /api/v1/sign/authenticode/hash del servidor, el flag CLI sgcsign sign --prehash y el método TsgcSignClient.SignAuthenticodeHashAsync del SDK de .NET.

Firmadores ClickOnce, NuGet y VSIX

Tres nuevos firmadores cubren el ecosistema de distribución para desarrolladores de Microsoft.

TsgcClickOnceSigner firma manifiestos de implementación .application y manifiestos de aplicación .exe.manifest utilizando XML-DSig W3C envolvente, igualando la salida de mage.exe de Microsoft. El firmador reescribe el nodo publisherIdentity con el issuerKeyHash del certificado.

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 firma paquetes de autor .nupkg, produciendo un blob CMS/PKCS#7 SignedData (signing certificate v2, commitment-type "proof of origin") con una contrafirma RFC 3161 opcional.

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 implementa firmas digitales OPC (Open Packaging Convention) para extensiones de Visual Studio, calculando referencias XML-DSig por parte y reescribiendo [Content_Types].xml y _rels/.rels del paquete.

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;

Los tres reutilizan la misma interfaz IsgcKeyProvider que los firmadores XAdES / PAdES / CAdES existentes, por lo que un token AWS KMS, Azure Trusted Signing o PKCS#11 configurado para firma de facturas puede reutilizarse para firma de binarios sin fontanería adicional.

Pack de cumplimiento eIDAS / UE

Esta versión introduce el pack eIDAS — tres nuevas unidades que, en conjunto, permiten a una aplicación Delphi validar una firma contra el marco oficial de confianza de la UE y producir contenedores de archivo a largo plazo.

Contenedores ASiC (ETSI EN 319 162-1)

sgcSign_ASiC construye y analiza contenedores ASiC-S (un solo documento) y ASiC-E (múltiples documentos) en ambas variantes XAdES y CAdES. La salida es un ZIP determinista con la entrada mimetype en primer lugar y la firma ubicada bajo 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;

Lista de confianza LOTL / EUTL

sgcSign_TrustList descarga la List of Trusted Lists de la UE, sigue los punteros a las listas de confianza por Estado miembro y analiza cada entrada TSPService. El resultado es un catálogo en memoria de unos 3.600 servicios en 31 Estados miembros. La consulta IsQualifiedAtTime clasifica cualquier certificado como "emitido por un TSP cualificado" en un momento de firma dado — la operación necesaria para promocionar una firma de avanzada (AdES) a cualificada (QES) según el artículo 25 de eIDAS.

Cloud Signature Consortium (CSC v2)

TsgcCSCKeyProvider es una implementación de IsgcKeyProvider para la API v2 de Cloud Signature Consortium — el estándar europeo para firma cualificada remota utilizado por Buypass, Certinomis, Globalsign EU, InfoCert, Namirial, Trust Pro y otros QTSP. El proveedor gestiona autenticación Basic / OAuth2 / OTP, lista las credenciales del usuario, obtiene la cadena de certificados y realiza firma remota solo por hash mediante autorización 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;

Nueve perfiles laborales

Nueve perfiles preconfigurados destinados a documentos europeos de derecho laboral (contratos de trabajo, nóminas, acuerdos de traslado):

PerfilPaísNivelC14NTSAOCSP
spEmploymentDEAlemaniaB-LTExclusiva
spEmploymentITItaliaB-LTC14N 1.0
spEmploymentESEspañaB-TExclusivaNo
spEmploymentFRFranciaB-TExclusivaNo
spEmploymentPLPoloniaB-TExclusivaNo
spEmploymentATAustriaB-LTExclusiva
spEmploymentBEBélgicaB-LTExclusiva
spEmploymentPTPortugalB-LTExclusiva
spEmploymentNLPaíses BajosB-TExclusivaNo

Una nueva demo EU_Employment incluye el flujo completo (firma → empaquetado ASiC-E → verificación LOTL → clasificación QTSP).

Peppol BIS Billing 3.0 búlgaro

El nuevo perfil TsgcProfilePeppolBG firma facturas UBL 2.1 búlgaras (moneda BGN, IVA del 20 %, NIF IVA BG / EIK, IBAN BG, endpoint scheme ID 9926) en XAdES B-T con C14N exclusiva. Las demos de Delphi y C++Builder incluyen una plantilla de factura completamente cumplimentada.

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;

Integraciones CI/CD

sgcSign Server ahora incluye artefactos de primera categoría para cada pipeline común:

Generador de códigos QR

Para TicketBAI, VeriFactu y perfiles similares que requieren un código QR en la factura imprimible, la nueva unidad sgcSign_QRCode incluye un generador en Pascal puro que implementa ISO/IEC 18004 en modo byte — los cuatro niveles de ECC, versiones de 1 a 40, Reed-Solomon en GF(256), puntuación completa de penalización de máscara — con un renderizador TBitmap. Sin DLL externa, sin sorpresas de licencias.

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 y RSA-PSS

TsgcPEMKeyProvider ahora importa claves privadas EC mediante Windows BCrypt CNG (ECCPRIVATEBLOB) y firma con salida cruda r||s para XML-DSig. Un nuevo método SignDataPSS produce firmas RSA-PSS (SHA-256, salt = 32 bytes) utilizando BCRYPT_PAD_PSS — requerido por un número creciente de perfiles nacionales de facturación electrónica.

En el lado de la verificación, TsgcSignatureVerifier importa claves públicas EC desde BCRYPT_ECCPUBLIC_BLOB y valida firmas ECDSA para las mismas tres curvas tanto en la ruta del SignatureValue XAdES como en la ruta cruda VerifyData.

Para que esto funcione, TsgcX509Certificate ahora analiza la extensión KeyUsage y la expone mediante la propiedad KeyUsage y los helpers HasKeyUsageDigitalSignature / HasKeyUsageNonRepudiation, y la nueva propiedad PublicKeyParameters expone el TLV crudo de parámetros AlgorithmIdentifier (el OID de curva con nombre para certificados EC).

Sobrecargas WideString para Delphi 7

Para llamadores que pasan texto fuera del ACP (KSeF polaco, myDATA griego, Peppol búlgaro, etc.), la API pública de firma y verificación ahora expone sobrecargas WideString en TsgcXAdESSigner.SignXML, SignXMLDetached, SignXMLEnveloping (y los métodos correspondientes en TsgcDocumentSigner y TsgcSignatureVerifier). Esto garantiza Unicode sin pérdidas de entrada/salida en Delphi 7 — sin viaje de ida y vuelta por ACP — y es equivalente a las sobrecargas string en Delphi 2009+.

Correcciones de conformidad y fiabilidad

El lote de correcciones de errores en 2026.5 cierra una larga lista de problemas XAdES / PFX / verificador detectados frente a endpoints reales de autoridades tributarias.

Actualización

2026.5 es una actualización directa para proyectos 2026.4 existentes. El único cambio de comportamiento al que prestar atención es TsgcDocumentSigner: el código que dependía de que emitiera XML-DSig plano para los perfiles AdES ahora producirá correctamente XAdES — esto es lo que las autoridades tributarias pedían, pero si su prueba de integración estaba fijada a la salida heredada, deberá actualizar los archivos de referencia.

Los clientes con una suscripción activa pueden descargar la nueva compilación desde el área de cliente. Los usuarios de la versión de prueba pueden obtener el instalador actualizado en esegece.com/products/sgcsign/sgcsign-download.

¿Preguntas, comentarios o ayuda para la migración? Contáctenos — recibirá respuesta de las personas que escribieron el código.