sgcSign 2026.5 — Authenticode, Pacote EU eIDAS e 9 Perfis Trabalhistas

· Lançamentos

Apenas um mês após o lançamento inicial, o sgcSign 2026.5 entrega uma grande expansão da biblioteca. Esta versão adiciona assinatura Microsoft Authenticode para binários do Windows, três novos assinadores de distribuição de código (ClickOnce, NuGet, VSIX), um pacote completo de conformidade EU eIDAS (contêineres ASiC, lista de confiança LOTL / EUTL, assinatura remota do Cloud Signature Consortium), nove perfis trabalhistas pré-configurados por país, um perfil Peppol BIS Billing 3.0 búlgaro, um gerador de QR Code nativo, suporte a ECDSA P-256/384/521 e RSA-PSS, integrações CI/CD completas, e um conjunto extenso de correções de conformidade XAdES / PFX.

Esta postagem percorre os destaques, com trechos Delphi prontos para colar para cada novo componente.

Microsoft Authenticode

TsgcAuthenticodeSigner assina arquivos Portable Executable do Windows (.exe, .dll, .sys) conforme a especificação Authenticode. O assinador analisa o PE, faz seu hash com o algoritmo Authenticode (ignorando o checksum e a tabela de certificados existente), constrói um blob PKCS#7 SignedData completo com o conteúdo de dados indireto SPC e o anexa à tabela de certificados do binário.

Hashes de SHA-1 até SHA-512 são suportados, carimbos do tempo RFC 3161 são incorporados como atributos não assinados, e AppendSignature := True produz assinaturas aninhadas (por exemplo, assinatura dupla SHA-1 + SHA-256 para compatibilidade com versões legadas do 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;

A verificação é simétrica. TsgcAuthenticodeVerifier.Verify retorna um registro com o resultado, os hashes computado e incorporado, o subject/issuer do signatário, e se um carimbo do tempo está 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;

Assinatura Authenticode apenas por hash

Artefatos grandes de CI (instaladores, runtimes, drivers) tornam dolorosa a transferência do PE completo para um assinador remoto. O novo fluxo de assinatura apenas por hash permite que o cliente calcule o hash Authenticode localmente e envie apenas o digest de 32 bytes ao sgcSign Server. O servidor retorna o blob PKCS#7 não anexado, e o cliente o incorpora de volta no binário — reduzindo uploads de vários megabytes a poucos KB em agentes com largura de banda restrita.

// 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;

A mesma operação é exposta pelo endpoint POST /api/v1/sign/authenticode/hash do servidor, pela flag CLI sgcsign sign --prehash, e pelo método TsgcSignClient.SignAuthenticodeHashAsync no SDK .NET.

Assinadores ClickOnce, NuGet e VSIX

Três novos assinadores cobrem o ecossistema de distribuição para desenvolvedores Microsoft.

TsgcClickOnceSigner assina manifestos de implantação .application e manifestos de aplicação .exe.manifest usando XML-DSig W3C envelopado, correspondendo à saída do mage.exe da Microsoft. O assinador reescreve o nó publisherIdentity com o issuerKeyHash do 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 assina pacotes .nupkg de autor, produzindo um blob CMS/PKCS#7 SignedData (signing certificate v2, commitment-type "proof of origin") com uma contra-assinatura 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 assinaturas digitais OPC (Open Packaging Convention) para extensões do Visual Studio, computando referências XML-DSig por parte e reescrevendo [Content_Types].xml e o _rels/.rels do pacote.

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;

Os três reutilizam a mesma interface IsgcKeyProvider dos assinadores XAdES / PAdES / CAdES existentes, então um AWS KMS, Azure Trusted Signing ou token PKCS#11 configurado para assinatura de faturas pode ser reutilizado para assinatura de binários sem encanamento extra.

Pacote de conformidade EU eIDAS

Esta versão introduz o pacote eIDAS — três novas unidades que, juntas, permitem que uma aplicação Delphi valide uma assinatura contra o framework oficial de confiança da UE e produza contêineres de arquivamento de longo prazo.

Contêineres ASiC (ETSI EN 319 162-1)

sgcSign_ASiC constrói e analisa contêineres ASiC-S (documento único) e ASiC-E (múltiplos documentos) em ambos os formatos XAdES e CAdES. A saída é um ZIP determinístico com a entrada mimetype primeiro e a assinatura colocada sob 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 confiança LOTL / EUTL

sgcSign_TrustList baixa a List of Trusted Lists da UE, segue os ponteiros de lista de confiança de cada Estado-Membro, e analisa cada entrada TSPService. O resultado é um catálogo em memória de aproximadamente 3.600 serviços em 31 Estados-Membros. A consulta IsQualifiedAtTime classifica qualquer certificado como "emitido por um TSP Qualificado" em um determinado momento de assinatura — a operação necessária para promover uma assinatura de avançada (AdES) para qualificada (QES) sob o Artigo 25 do eIDAS.

Cloud Signature Consortium (CSC v2)

TsgcCSCKeyProvider é uma implementação de IsgcKeyProvider para a API v2 do Cloud Signature Consortium — o padrão europeu para assinatura qualificada remota usado por Buypass, Certinomis, Globalsign EU, InfoCert, Namirial, Trust Pro e outros QTSPs. O provedor lida com autenticação Basic / OAuth2 / OTP, lista as credenciais do usuário, busca a cadeia de certificados, e realiza assinatura remota apenas por hash usando autorização 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;

Nove perfis trabalhistas

Nove perfis pré-configurados visam documentos europeus de direito trabalhista (contratos de trabalho, contracheques, acordos de transferência):

PerfilPaísNívelC14NTSAOCSP
spEmploymentDEAlemanhaB-LTExclusivaSimSim
spEmploymentITItáliaB-LTC14N 1.0SimSim
spEmploymentESEspanhaB-TExclusivaSimNão
spEmploymentFRFrançaB-TExclusivaSimNão
spEmploymentPLPolôniaB-TExclusivaSimNão
spEmploymentATÁustriaB-LTExclusivaSimSim
spEmploymentBEBélgicaB-LTExclusivaSimSim
spEmploymentPTPortugalB-LTExclusivaSimSim
spEmploymentNLPaíses BaixosB-TExclusivaSimNão

Uma nova demo EU_Employment traz o pipeline completo (assinar → empacotar ASiC-E → verificação LOTL → classificação QTSP).

Peppol BIS Billing 3.0 búlgaro

O novo perfil TsgcProfilePeppolBG assina faturas UBL 2.1 búlgaras (moeda BGN, IVA de 20%, BG VAT / EIK, BG IBAN, endpoint scheme ID 9926) em XAdES B-T com C14N exclusiva. As demos Delphi e C++Builder trazem um modelo de fatura totalmente preenchido.

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;

Integrações CI/CD

O sgcSign Server agora entrega artefatos de primeira classe para cada pipeline comum:

Gerador de QR Code

Para TicketBAI, VeriFactu e perfis similares que exigem um código QR na fatura imprimível, a nova unidade sgcSign_QRCode traz um gerador em Pascal puro implementando ISO/IEC 18004 em modo byte — todos os quatro níveis ECC, versões 1 a 40, Reed-Solomon GF(256), pontuação completa de penalidade de máscara — com um renderizador TBitmap. Sem DLL externa, sem surpresas de licenciamento.

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

TsgcPEMKeyProvider agora importa chaves privadas EC via Windows BCrypt CNG (ECCPRIVATEBLOB) e assina com saída r||s bruta para XML-DSig. Um novo método SignDataPSS produz assinaturas RSA-PSS (SHA-256, salt = 32 bytes) usando BCRYPT_PAD_PSS — requerido por um número crescente de perfis nacionais de faturamento eletrônico.

No lado da verificação, TsgcSignatureVerifier importa chaves públicas EC de BCRYPT_ECCPUBLIC_BLOB e valida assinaturas ECDSA para as mesmas três curvas tanto no SignatureValue XAdES quanto nos caminhos de código VerifyData brutos.

Para fazer isso funcionar, TsgcX509Certificate agora analisa a extensão KeyUsage e a expõe via a propriedade KeyUsage mais os auxiliares HasKeyUsageDigitalSignature / HasKeyUsageNonRepudiation, e a nova propriedade PublicKeyParameters expõe o TLV de parâmetros bruto do AlgorithmIdentifier (o OID de curva nomeada para certificados EC).

Sobrecargas WideString para Delphi 7

Para chamadores que passam texto não-ACP (Polish KSeF, Greek myDATA, Bulgarian Peppol, etc.), a API pública de assinatura e verificação agora expõe sobrecargas WideString em TsgcXAdESSigner.SignXML, SignXMLDetached, SignXMLEnveloping (e os métodos correspondentes em TsgcDocumentSigner e TsgcSignatureVerifier). Isso garante Unicode sem perdas de entrada/saída no Delphi 7 — sem round-trip ACP — e é equivalente às sobrecargas string no Delphi 2009+.

Correções de conformidade e confiabilidade

O lote de correções de bugs no 2026.5 fecha uma longa lista de problemas XAdES / PFX / verificador descobertos contra endpoints reais de autoridades fiscais.

Atualizando

2026.5 é uma atualização drop-in para projetos 2026.4 existentes. A única mudança comportamental a observar é em TsgcDocumentSigner: código que dependia de sua emissão de XML-DSig simples para os perfis AdES agora produzirá XAdES corretamente — é isso que as autoridades fiscais pediram, mas se seu teste de integração estava fixado na saída legada, você precisará atualizar os arquivos golden.

Clientes com uma assinatura ativa podem baixar a nova compilação na área do cliente. Usuários de avaliação podem obter o instalador atualizado em esegece.com/products/sgcsign/sgcsign-download.

Dúvidas, comentários ou ajuda com migração? Entre em contato — você receberá uma resposta das pessoas que escreveram o código.