function Tufe.CrearTRA: string;
const
PKCS7_NOATTR = $100;
var
s: TStringList;
cbuf: string;
kbuf: string;
pXml: string;
bioc, biok, biom, bios: PBIO;
fc: PX509;
fk: PEVP_PKEY;
smsg: PPKCS7;
buf: string;
nlen: LongInt;
begin
Result := '';
try
s := TStringList.Create;
try
pXml:='<?xml version="1.0" encoding="UTF8"?>'+
'<loginTicketRequest version="1.0">'+
'header'+
'<source>'+origenToken+'</source>'+
'<destination>'+destinoToken+'</destination>'+
'<uniqueId>'+IntToStr(Randomrange(1,4325398))+'</uniqueId>'+
'<generationTime>'+FormatDateTime('YYYY-MM-DD"T"HH:nn:ss-03:00',IncMinute(now, -10))+'</generationTime>'+
'<expirationTime>'+FormatDateTime('YYYY-MM-DD"T"HH:nn:ss-03:00',IncMinute(now, +10))+'</expirationTime>'+
'/header'+
'<service>'+servicioToken+'</service>'+
'</loginTicketRequest>';
s.LoadFromFile(certifToken);
cbuf := s.Text;
s.LoadFromFile(llaveToken);
kbuf := s.Text;
bioc := BIO_new_mem_buf(@cbuf[1], Length(cbuf));
fc := PEM_read_bio_X509(bioc, nil, nil, nil);
biok := BIO_new_mem_buf(@kbuf[1], Length(kbuf));
fk := PEM_read_bio_PrivateKey(biok, nil, nil, nil);
biom := BIO_new_mem_buf(@pXml[1], Length(pXml));
smsg := PKCS7_sign(fc, fk, nil, biom, PKCS7_NOATTR);
bios := BioNew(BioSMem);
PEM_write_bio_PKCS7(bios, smsg);
SetLength(buf, 4096);
nlen := BIORead(bios, buf, Length(buf));
writeln(buf);
s.Text := Copy(buf, 0, nlen);
// delete BEGIN PKCS7 -- END PKCS7
s.Delete(0);
s.Delete(s.Count - 1);
Result := s.Text;
//writeln(Result);
finally
s.Free;
end;
except on E:Exception do writeln(E.Message); end;
end;