Menu

#2 Crash dell'Applicazione su Hash String

1.0
open
None
2017-12-16
2017-11-30
No

Salve,

ho sempre usato DCPCrypt integrandola all'interno del mio codice (non come componente, includendo direttamente nel programma i file che servivano.

Quando eseguo il seguente codice, il programma va in access violation

function Hash_Haval(str: string): string;
var
Hash: TDCP_Haval;
Digest: array[0..16] of byte;
i: integer;
s: string;
begin
Hash:= TDCP_haval.Create(nil);
Hash.Init;
Hash.UpdateStr(str);
Hash.Final(Digest);
s:= '';
for i:= 0 to 19 do
s:= s + IntToHex(Digest[i],2);
Hash_Haval := s;
Hash.Free;
end;

In particolare il codice crasha con l'assegnazione s:='';

Se vado a verificare, con il debug, i valori di s, Digest e Hash sono corretti fino a che viene eseguito Hash.Final(Digest), dopodichè Delphi li segnala come "Valore Inaccessibile". Potrebbe significare qualche corruzione dell'Heap che però non ho modo di controllare. Di sicuro l'eseguzione di .Final va a corrompere qualcosa.

Facendo un test su tutti gli hash, ciò avviene solo per Haval, Tiger, tutte le SHA e la RipeMD190, mentre le MD (sia 4 che 5) e la RipeMD128 paiono funzionare (non ho testato se l'hashing sia corretto, ma comunque viene "sputato" fuori qualcosa, a differenza degli altri che vanno in Access Violation.
Anche il precedente codice di Dave Burton si comporta nello stesso modo.

Sto facendo qualche errore io o c'è un bug da qualche parte?

Utilizzo Delphi 10.2 (25.0.26309.314) su Windows 7 x64 Ultimate

Inoltre, solo come cosa accessoria: MD2 e SHA224 sono scomparsi? Nel package vecchio di Dave Burton esistevano mentre non li trovo più nel nuovo...

Grazie

1 Attachments

Discussion

  • Gabriele Lanza

    Gabriele Lanza - 2017-11-30

    UPDATE: il SelfTest, restituisce valore 1, quindi i test interni vanno...

     
  • Lorenzo Monti

    Lorenzo Monti - 2017-12-16

    Salve,
    se compila con definito il simbolo DIGEST256 (abilitato per default nella mia distribuzione) le dimensioni dell'hash sono di 256 bit = 32 byte
    Deve dichiarare
    Digest: array[0..31] of byte;
    altrimenti, ovviamente, la funzione Final scrive oltre la fine di Digest ed è per questo che il software schianta quando accede alla stringa s (che è sullo stack qualche byte dopo Digest, e quindi viene corrotta).
    Se invece vuole l'hash da 16 byte deve commentare {$DEFINE DIGEST256} e decommentare {$DEFINE DIGEST128}.
    Per quanto riguarda MD2 e SHA224, ho cercato nella distribuzione di Dave Burton ma non li ho trovati. Dove sono? Forse in una versione molto vecchia?

     

Log in to post a comment.