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):
| Perfil | País | Nivel | C14N | TSA | OCSP |
|---|---|---|---|---|---|
spEmploymentDE | Alemania | B-LT | Exclusiva | Sí | Sí |
spEmploymentIT | Italia | B-LT | C14N 1.0 | Sí | Sí |
spEmploymentES | España | B-T | Exclusiva | Sí | No |
spEmploymentFR | Francia | B-T | Exclusiva | Sí | No |
spEmploymentPL | Polonia | B-T | Exclusiva | Sí | No |
spEmploymentAT | Austria | B-LT | Exclusiva | Sí | Sí |
spEmploymentBE | Bélgica | B-LT | Exclusiva | Sí | Sí |
spEmploymentPT | Portugal | B-LT | Exclusiva | Sí | Sí |
spEmploymentNL | Países Bajos | B-T | Exclusiva | Sí | No |
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:
- GitHub Actions — Action compuesta con firma Authenticode solo por hash.
- Azure DevOps — tarea nativa con integración de archivos seguros.
- Jenkins — DSL de pipeline declarativo más biblioteca compartida.
- Docker — imagen Windows Server Core más un archivo
docker-compose. - Helm — chart de Kubernetes para sgcSign Server de alta disponibilidad.
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.
TsgcDocumentSignerahora produce correctamente XAdES para los perfiles AdES. Internamente delega enTsgcXAdESSignerpara la rutasfXAdES, y lanza un error claro parasfPAdES/sfCAdES(utilice los firmadores específicos). Una nueva propiedad publicadaFormat: TsgcSignatureFormat(por defectosfXAdES) hace explícita la elección. Versiones anteriores emitían XML-DSig plano independientemente del perfil, lo que era rechazado por los servicios nacionales de facturación electrónica.TsgcPFXKeyProviderincorpora una nueva propiedad publicadaHashAlgorithm(por defectohaSHA256), yTsgcXAdESSignerahora propaga el hash del perfil activo a los proveedores PFX. Las facturas firmadas con perfil FacturaeB2B respaldadas por PFX ahora son correctamente RSA-SHA1, corrigiendo el rechazo de FACe INVALID_INVOICE-122 «los datos de la firma no son correctos».TsgcPFXKeyProviderahora admite archivos P12 modernos:PKCS12_PREFER_CNG_KSP, iteración y sondeo multi-certificado, adquisición en dos fases (ONLY_NCRYPTy luegoPREFER_NCRYPT) y firma CNG medianteNCryptSignHash.- Conformidad XAdES KSeF / ETSI — envoltorio V1
SigningCertificate, emisión condicional deSignaturePolicyIdentifier,X509SerialNumberdecimal, construcción única deSignedProperties(corrección de carrera del reloj), transformaciones exc-c14n explícitas en la referencia aSignedPropertiesy una nueva propiedadSignatureParentElement.TsgcSignatureVerifierahora resuelveURI=#<Id>mediante búsqueda por Id de elemento. - Análisis de extensiones X.509 — el contenido de la etiqueta v3
[3] EXPLICIT Extensionsse envolvía por duplicado, omitiendo silenciosamenteKeyUsage,ExtendedKeyUsage, AIA, CDP, SubjectAltName y BasicConstraints en cada certificado. Corregido. - Etiquetas XML autocerradas —
ExtractFullElementahora gestiona correctamente<ds:DigestMethod Algorithm="…/sha1"/>. Versiones anteriores tenían SHA-256 por defecto, rompiendo la verificación FacturaeB2B con "Digest length mismatch for Reference 0". - Reserva a C14N inclusiva —
TsgcSignatureVerifieraplica C14N inclusiva implícita a referencias fragmento / URI vacía que omiten una transformación explícita, según XML-DSig §4.3.3.2. Corrige "Digest value mismatch" en referencias KeyInfo y body en perfiles con C14N inclusiva (FacturaeB2B). - Endurecimiento PEM — corrección Unicode de
ReadFileContent, decodificación PKCS#8 en dos pasos, keyspecAT_KEYEXCHANGE, contenedor CSP con sufijo GUID, PKCS#8 cifrado nativo (PBES2 / PBKDF2 / AES-CBC) mediante BCrypt,LoadCertificateOnlyy reconocimiento de marcador EC. - Mantenimiento en tiempo de diseño — los nueve componentes firmador / verificador ahora limpian automáticamente las referencias enlazadas mediante
Notification(opRemove), eliminando punteros colgantes cuando un proveedor de claves o un cliente TSA se elimina del formulario. - Higiene de compilación — W1000 (UTF8Decode) en
sgcSign_ASiCcorregido mediante una alternativa{$IFDEF UNICODE} UTF8ToString; las advertencias H2077 / H2219 de código muerto se han limpiado ensgcSign_XAdESysgcSign_TrustList.
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.
