Buenos días
Como comente adquirimos SecureBlackBox 2020, y los componentes han cambiado respecto a la 16. Por si alguien se encuentra en la misma situación os dejo el código para la firma del TicketBai.
Código Delphi
[-] T_Firmante = record
r_Nombre_firma: String;
r_ID: String;
r_Metodo_Canonicalization: String;
r_Hash_algorithm: String;
r_SigPolicyID: String; r_SigPolicyHash: string; r_SigPolicyHashAlgorithm: string; r_SigPolicyURI: string;
Código Delphi
[-]procedure p_firmar_xml(el_fichero : string; el_firmante : T_Firmante);
var
CertificateStorage: TsbxCertificateStorage; sbxXAdESSigner1 : TsbxXAdESSigner;
cert : TsbxCertificate;
i : Integer;
encontrado : Boolean;
function bintostr(const bin: array of byte): string;
const
HexSymbols = '0123456789ABCDEF';
var
i: integer;
begin
SetLength(Result, 2 * Length(bin));
for i := 0 to Length(bin) - 1 do
begin
Result[1 + 2 * i + 0] := HexSymbols[1 + bin[i] shr 4];
Result[1 + 2 * i + 1] := HexSymbols[1 + bin[i] and $0F];
end;
end;
begin
sbxXAdESSigner1 := TsbxXAdESSigner.Create(nil);
sbxXAdESSigner1.InputFile := el_fichero;
sbxXAdESSigner1.OutputFile := el_fichero;
CertificateStorage := TsbxCertificateStorage.Create(nil);
if CertificateStorage.Opened then
CertificateStorage.Close(True);
CertificateStorage.Open('system://currentuser@localhost/?store=MY');
encontrado := False;
for i := 0 to CertificateStorage.Certificates.Count - 1 do
begin
cert := CertificateStorage.Certificates[i];
if bintostr(Cert.SerialNumber) = el_firmante.r_ID then
begin
sbxXAdESSigner1.SigningCertificate := cert;
encontrado := True;
end;
end;
if not encontrado then
begin
Application.MessageBox('Firma no encontrada',
'Proceso de firma', MB_OK + MB_ICONWARNING
+ MB_DEFBUTTON2);
Exit;
end;
sbxXAdESSigner1.SignatureType := cxstEnveloped;
sbxXAdESSigner1.CanonicalizationMethod := cxcmCanon;
sbxXAdESSigner1.HashAlgorithm := el_firmante.r_Hash_algorithm;
sbxXAdESSigner1.XMLElement := '';
sbxXAdESSigner1.EnableXAdES := True;
sbxXAdESSigner1.XAdESVersion := xav132;
sbxXAdESSigner1.XAdESForm := xafEPES;
sbxXAdESSigner1.Config('SigPolicyID=' + el_firmante.r_SigPolicyID);
sbxXAdESSigner1.Config('SigPolicyHash=' + el_firmante.r_SigPolicyHash); sbxXAdESSigner1.Config('SigPolicyHashAlgorithm=' + el_firmante.r_SigPolicyHashAlgorithm);
sbxXAdESSigner1.Config('SigPolicyURI=' + el_firmante.r_SigPolicyURI);
try
sbxXAdESSigner1.Sign();
except
MessageDlg('Error en el proceso de firma', mtError, [mbOK], 0);
end;
end;
Espero os sirva,
Saludos