Hallo TM
ich habe in der vergangenen Nacht deine
DEC geladen, getestet und dann gesehen, dass in deiner Schleife der Data-Pointer nicht angepasst wird. absorb() liest deshalb immer die ersten Bytes der Nachricht und liefert falsche Resultate (ausser bei N=xxxxxxxxx.xxxxxxxxx, x=0..255)
Bei deinem Test mit der Nachricht for var i := 1 to 200 do s := s + #$A3; fällt das Problem nicht auf, da absorb() immer nur #$A3 liest. Dein absorb() in der Schleife las halt bei jedem Durchlauf die ersten Bytes anstatt korrekt der Reihe nach irgendwann alle.
So sollte es funktionieren (Code unten). Du oder irgendwer hier im Forum können das sicher schöner schreiben
. V.a. aber nicht nur Englischer und so...
Ich habe hier unten im Code eine Variable prorunde eingebaut. Das war nur zum Testen der Funktionsweise von absorb(N,x). (Ein Kontentheoretiker hat uns mal während einer Woche besucht und jene mathematische Probleme aufgezählt, für welche 17 die Lösung ist. Wenn man also mal nicht weiter weiss, dann ist 17....
).
absorb(N,x) ist so geschrieben, dass du für prorunde irgend einen positiven Wert <= maxint div 8 wählen kannst. Ein hoher Wert macht natürlich Sinn.
Delphi-Quellcode:
procedure THash_SHA3Base.Calc(
const Data; DataSize: Integer);
var prorunde, absorb_byte : integer;
gelesen : integer;
p : PByte;
begin
// due to the way the inherited calc is constructed it must not be called here!
if (DataSize > 0)
then
begin
p := Pointer(@Data);
gelesen := 0;
prorunde := 17;
while ( DataSize > 0 )
do
begin
absorb_byte := DataSize;
if absorb_byte > prorunde
then absorb_byte := prorunde;
Absorb( @p[gelesen], absorb_byte*8);
inc( gelesen, absorb_byte );
dec( DataSize, absorb_byte );
end;
end
else
FinalStep;
end;
Ich habe die Funktion getestet mit drei SHA3-224 Onlinerechnern; scheint OK zu sein.