Ver Mensaje Individual
  #279  
Antiguo 17-09-2020
juramisa juramisa is offline
Miembro
 
Registrado: abr 2007
Posts: 54
Reputación: 18
juramisa Va por buen camino
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;
    // El fichero pdf en el que se encuentra en las políticas de firma. pulsando esa dirección
    // debería presentarnos dicho fichero pdf
    r_SigPolicyID: String; // https://ticketbai.eus/politicafirma
    // El fichero pdf completo calculamos su SHA256 y nos dará un valor hexadecimal, y otro en base64
    // Pasamos el valor hexadecimal
    r_SigPolicyHash: string; // 39D59C038EBB3B7DF6C61ED2F740B318F0C50F93ADCD35E26BE8FF8E76D21DA8
    // Algoritmo
    r_SigPolicyHashAlgorithm: string; //SHA256
    // Direccion URI de política de firma
    r_SigPolicyURI: string; //https://ticketbai.eus/politicafirma;



Código Delphi [-]
procedure p_firmar_xml(el_fichero : string; el_firmante : T_Firmante);
var
  CertificateStorage: TsbxCertificateStorage;  // Nuevo componente SecureBlackBox 2020
  sbxXAdESSigner1 : TsbxXAdESSigner;  // Nuevo componente SecureBlackBox 2020

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

  sbxXAdESSigner1.XMLElement := '';  // Todo el documento

  sbxXAdESSigner1.EnableXAdES := True;

  sbxXAdESSigner1.XAdESVersion := xav132;

  sbxXAdESSigner1.XAdESForm := xafEPES;

  sbxXAdESSigner1.Config('SigPolicyID=' + el_firmante.r_SigPolicyID); // https://ticketbai.eus/politicafirma');

  sbxXAdESSigner1.Config('SigPolicyHash=' + el_firmante.r_SigPolicyHash); // 39D59C038EBB3B7DF6C61ED2F740B318F0C50F93ADCD35E26BE8FF8E76D21DA8; 
  sbxXAdESSigner1.Config('SigPolicyHashAlgorithm=' + el_firmante.r_SigPolicyHashAlgorithm); //=SHA256;

  sbxXAdESSigner1.Config('SigPolicyURI=' + el_firmante.r_SigPolicyURI); //https://ticketbai.eus/politicafirma;

  try
    sbxXAdESSigner1.Sign();
  except
      MessageDlg('Error en el proceso de firma', mtError, [mbOK], 0);
  end;
end;

Espero os sirva,

Saludos

Última edición por Neftali [Germán.Estévez] fecha: 17-09-2020 a las 09:09:41. Razón: Añadir TAG's al código
Responder Con Cita