![]() |
AW: DEC Design Frage (SHA3)
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:
Ich habe die Funktion getestet mit drei SHA3-224 Onlinerechnern; scheint OK zu sein.
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; |
AW: DEC Design Frage (SHA3)
Zitat:
Delphi-Quellcode:
:stupid:
absorb_bytes := Min(DataSize, {prorunde}BlockSize);
Zitat:
Delphi-Quellcode:
)
s := s + Char(i + 35);
Aber nur um die Schleife zu ersetzen, ![]() ![]() ![]() |
AW: DEC Design Frage (SHA3)
Zitat:
Genau. Es ist und war mir voll bewusst, dass man eine min Funktion schreiben könnte (hatte ich sogar während dem Testen). Oder in DECHash die Unit Math einbinden kann. Ich bin kein Fan, von Funktionsaufrufen, wo's keine braucht. Wer hier mit Lesbarkeit argumentiert, muss sich eine Hirnbrille kaufen. Also besten Dank für deinen grandiosen Hinweis ;-). Blocksize (dein Code). Geht zwar auch (prorunde ist in [1 bis maxint div 8] frei wählbar, BlockSize hingegen ist in DECHash definiert und eine feste Grösse abhängig vom verwendeten Zustandsvektor (5 Worte zu l Bit (hier 6)) und von n (hier 224)). Wenn du dir function THash_SHA3Base.Absorb(Data: Pointer; DatabitLen: Int32): Int32; anschaust ist BlockSize im Gegensatz zu meiner früheren Behauptung (als ich den Code noch nicht kannte) nicht Wert der Wahl. |
AW: DEC Design Frage (SHA3)
Keine Sorge, das ist eine Inline-Funktion, also der Compiler sollte den Aufruf entfernen.
System.Math.pas bindet auch kaum Code ein, außer einem SSE-Test und der SysUtils, aber für die ordentliche Fehlerbehandlung sollte die SysUtils ja eh schon drin sein. |
AW: DEC Design Frage (SHA3)
Jo... besten Dank. Ich deklariere - wenn ich auch mal kurze Hilfsfunktionen schreibe ;-) - auch inline, wo's sinnvoll ist.
Einen sonnigen Tag wünsche ich uns allen. |
AW: DEC Design Frage (SHA3)
Zitat:
so definiert... Grüße TurboMagic |
AW: DEC Design Frage (SHA3)
Na das ist ja blöd. So bekommt man doch nicht mit, wenn man irgendwo 'nen Offset falsch/vergessen hat. :shock:
|
AW: DEC Design Frage (SHA3)
Nur für himitsu ;-).
Delphi-Quellcode:
function min(const a,b : integer):integer;inline;
begin if a<b then Result := a else Result := b; end; procedure THash_SHA3Base.Calc(const Data; DataSize: Integer); var prorunde, absorbiere_bytes : 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 := maxint div 8; while ( gelesen < DataSize ) do begin absorbiere_bytes := min( DataSize-gelesen, prorunde ); Absorb( @p[gelesen], absorbiere_bytes*8); inc( gelesen, absorbiere_bytes ); end; end else FinalStep; end; |
AW: DEC Design Frage (SHA3)
Zitat:
Alle Testvektoren (zumindest die für 1600 Bit, die anderen aber glaube ich auch) aller SHA3 Varianten sind so von denen publiziert. Ach ja, die neue SHA3 Umsetzung hat lt. Michael noch einen Bug. Der schlägt nur unter gewissen Randbedingungen zu. Den beseitige ich später. "Dieser Bug tritt auf, wenn für die Länge t der Nachricht N gilt t mod MaxRoundSize liegt in [1...BlockSize-1]." Falls jemand einen Testvektor zur Hand hat würde ich den in die Unittests einbauen. Grüße TurboMagic |
AW: DEC Design Frage (SHA3)
Mein Testvektor.
Delphi-Quellcode:
Diese Seiten könnten helfen, falls jemand hilft beim Überprüfen deiner DEC:
var
s : RawByteString; ... for var i := 1 to 10 do s := s + 'e21et2e2et1208e7t12e07812te08127et1028e7t1208e7gd81d872t178r02tr370823'; s := s + 'TurboMagic'; // Rechnen writeln( s = 'f7fc914c8fe4827d866b02df2459840260f4adb0db4deb9fa661756c' ); ![]() ![]() ![]() Am besten holst du dir eines der unter #2 gelinkten Pakete: ![]() Dann kannst du automatisiert Hashes erzeugen und mit deiner DEC gegenchecken lassen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:29 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz