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):
| Perfil | País | Nível | C14N | TSA | OCSP |
|---|---|---|---|---|---|
spEmploymentDE | Alemanha | B-LT | Exclusiva | Sim | Sim |
spEmploymentIT | Itália | B-LT | C14N 1.0 | Sim | Sim |
spEmploymentES | Espanha | B-T | Exclusiva | Sim | Não |
spEmploymentFR | França | B-T | Exclusiva | Sim | Não |
spEmploymentPL | Polônia | B-T | Exclusiva | Sim | Não |
spEmploymentAT | Áustria | B-LT | Exclusiva | Sim | Sim |
spEmploymentBE | Bélgica | B-LT | Exclusiva | Sim | Sim |
spEmploymentPT | Portugal | B-LT | Exclusiva | Sim | Sim |
spEmploymentNL | Países Baixos | B-T | Exclusiva | Sim | Nã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:
- GitHub Actions — Action composta com assinatura Authenticode apenas por hash.
- Azure DevOps — task nativa com integração de secure-file.
- Jenkins — DSL de pipeline declarativo mais biblioteca compartilhada.
- Docker — imagem Windows Server Core mais um arquivo
docker-compose. - Helm — chart Kubernetes para sgcSign Server de alta disponibilidade.
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.
TsgcDocumentSigneragora produz corretamente XAdES para os perfis AdES. Internamente, delega paraTsgcXAdESSignerno caminhosfXAdES, e gera um erro claro parasfPAdES/sfCAdES(use os assinadores dedicados). Uma nova propriedade publicadaFormat: TsgcSignatureFormat(padrãosfXAdES) torna a escolha explícita. Versões anteriores emitiam XML-DSig simples independentemente do perfil, o que era rejeitado pelos serviços nacionais de faturamento eletrônico.TsgcPFXKeyProviderganha uma nova propriedade publicadaHashAlgorithm(padrãohaSHA256), eTsgcXAdESSigneragora propaga o hash do perfil ativo para os provedores PFX. Faturas FacturaeB2B assinadas com PFX agora são corretamente RSA-SHA1, corrigindo a rejeição FACe INVALID_INVOICE-122 «los datos de la firma no son correctos».TsgcPFXKeyProvideragora suporta arquivos P12 modernos:PKCS12_PREFER_CNG_KSP, iterar-e-sondar multi-cert, aquisição em duas etapas (ONLY_NCRYPTdepoisPREFER_NCRYPT) e assinatura CNG viaNCryptSignHash.- Conformidade XAdES KSeF / ETSI — wrapper V1
SigningCertificate, emissão condicional deSignaturePolicyIdentifier,X509SerialNumberdecimal,SignedPropertiesde construção única (correção de clock-race), transformações exc-c14n explícitas na referênciaSignedProperties, e uma nova propriedadeSignatureParentElement.TsgcSignatureVerifieragora resolveURI=#<Id>por consulta de Id de elemento. - Análise de extensões X.509 — o conteúdo da tag v3
[3] EXPLICIT Extensionsestava sendo encapsulado duas vezes, ignorando silenciosamenteKeyUsage,ExtendedKeyUsage, AIA, CDP, SubjectAltName e BasicConstraints em cada certificado. Corrigido. - Tags XML auto-fechadas —
ExtractFullElementagora trata<ds:DigestMethod Algorithm="…/sha1"/>corretamente. Versões anteriores assumiam SHA-256 por padrão, quebrando a verificação FacturaeB2B com "Digest length mismatch for Reference 0". - Fallback de C14N inclusiva —
TsgcSignatureVerifieraplica C14N inclusiva implícita a referências de fragmento / URI vazia que omitem uma transformação explícita, conforme XML-DSig §4.3.3.2. Corrige "Digest value mismatch" em referências KeyInfo e body em perfis de C14N inclusiva (FacturaeB2B). - Endurecimento PEM — correção Unicode de
ReadFileContent, decodificação PKCS#8 em duas etapas, keyspecAT_KEYEXCHANGE, container CSP com sufixo GUID, PKCS#8 criptografado nativo (PBES2 / PBKDF2 / AES-CBC) via BCrypt,LoadCertificateOnlye reconhecimento de marcador EC. - Manutenção em tempo de design — todos os nove componentes assinador / verificador agora limpam automaticamente referências vinculadas via
Notification(opRemove), eliminando ponteiros pendentes quando um provedor de chave ou cliente TSA é excluído do formulário. - Higiene de build — W1000 (UTF8Decode) em
sgcSign_ASiCcorrigido via fallback{$IFDEF UNICODE} UTF8ToString; avisos de código morto H2077 / H2219 limpos emsgcSign_XAdESesgcSign_TrustList.
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.
