Einzelnen Beitrag anzeigen

Muetze1
(Gast)

n/a Beiträge
 
#1

DEC: fehlerhafte Hashwerte unter C++

  Alt 12. Mai 2009, 21:13
Hallo negaH und alle anderen!

Wir nutzen die DEC Library nun schon vielfältig und oft, da sie einfach ein sehr gutes Werk ist, welches in vielen Bereichen verwendet werden kann. Bei uns ist ein gemischtes System in Benutzung, also C++ und Delphi gemischt. Von daher werden für Delphi Quellen auch entsprechende statische Librarys generiert. Dies dient u.a. der Erzeugung der .hpp Dateien als auch der LIB für den Linker. Wir haben mit vielen Delphi Bibliotheken kein Problem mit und hatten somit auch keine Bedenken bei der DEC. Die Lib ist nun schon eingebunden und bei meinem letzten Arbeitsauftrag bin ich damit auf die Nase gefallen. Hier hatte ich nun zum ersten Mal die DEC unter C++ genutzt, aber über einen Zwischenschritt von Delphi Code. Es ist eine fertige Bibliothek welche die DEC nur nutzt, u.a. zur Hash Generierung. Diese Library unter C++ genutzt bringt keine verwertbaren Ergebnisse. Nach mehrfachen debuggen etc. konnte ich den Fehler in der DEC nachweisen, welche mir unter C++ Programmen immer einen anderen Hash generierte von den gleichen Daten. Da das C++ Programm nur eine Bibliothek von mir nutzt, welche die DEC nutzt, war es einfach diese Bibliothek von mir mal in einem Delphi Programm aufzurufen und siehe da: Hashes stimmten immer.

Zusammengefasst folgendes Verhalten:

DEC Library direkt in Delphi Programm: richtiger Hash, mit jedem Prozessstart der gleiche
DEC Library direkt in C++ Programm: zufälliger Hash, während der Laufzeit konstant, mit jedem Prozessstart ein anderer
DEC Library indirekt* in einem C++ Programm: zufälliger Hash, während der Laufzeit konstant, mit jedem Prozessstart ein anderer

* indirekt bedeutet hierbei, das C++ Programm ruft eine Delphi Unit auf, welche die DEC aufruft.

Ich habe mal ein entsprechendes Projektsystem gebaut und angehangen um den Fehler zu verdeutlichen.

DEC.lib - die C++ Lib mit der DEC
Bug01a - Delphi Programm
Bug01b - C++ Programm mit direkten Aufruf
Bug01c - C++ Programm mit indirekten Aufruf

Genutzt wird hierbei RAD Studio 2007 mit allen Fixes und Updates.

Hier nochmal eine kurze Log mit den Aufrufen der Compilate:
Code:
Bug01a, erster Aufruf:

First attempt
hashing value 'test' with SHA384
hash value: 768412320F7B0AA5812FCE428DC4706B3CAE50E02A64CAA16A782249BFE8EFC4B7EF1CCB126255D196047DFEDF17A0A9

Second attempt
hashing value 'test' with SHA384
hash value: 768412320F7B0AA5812FCE428DC4706B3CAE50E02A64CAA16A782249BFE8EFC4B7EF1CCB126255D196047DFEDF17A0A9

Bug01a, zweiter Aufruf:

First attempt
hashing value 'test' with SHA384
hash value: 768412320F7B0AA5812FCE428DC4706B3CAE50E02A64CAA16A782249BFE8EFC4B7EF1CCB126255D196047DFEDF17A0A9

Second attempt
hashing value 'test' with SHA384
hash value: 768412320F7B0AA5812FCE428DC4706B3CAE50E02A64CAA16A782249BFE8EFC4B7EF1CCB126255D196047DFEDF17A0A9

Bug01b, erster Aufruf:

First attempt
hashing value 'test' with SHA384
hash value: 852DC1C54D632C2DE8D15BE4CFEABB730C1E18A47C6E28C8FFC96D93FB6EF4F6B947ECA11F2FD8B65A3BB62FDB71AD07

Second attempt
hashing value 'test' with SHA384
hash value: 852DC1C54D632C2DE8D15BE4CFEABB730C1E18A47C6E28C8FFC96D93FB6EF4F6B947ECA11F2FD8B65A3BB62FDB71AD07

Bug01b, zweiter Aufruf:

First attempt
hashing value 'test' with SHA384
hash value: 32EDC34544F5A47F121E3F2AE925D9EE5DEF3D5FD40ABE860F423B6C9926DDEAFCB4AE882BE394C791893066020BAE53

Second attempt
hashing value 'test' with SHA384
hash value: 32EDC34544F5A47F121E3F2AE925D9EE5DEF3D5FD40ABE860F423B6C9926DDEAFCB4AE882BE394C791893066020BAE53

Bug01c, erster Aufruf:

First attempt
hashing value 'test' with SHA384
hash value: FEEEB9B21A027909711598969183D2750A013B9BEAB5E16C73F395A721AF3FD0DF3339E849DB3E818476B8F58E70A33C

Second attempt
hashing value 'test' with SHA384
hash value: FEEEB9B21A027909711598969183D2750A013B9BEAB5E16C73F395A721AF3FD0DF3339E849DB3E818476B8F58E70A33C

Bug01c, zweiter Aufruf:

First attempt
hashing value 'test' with SHA384
hash value: 84A9B12CD17583412EEC5997DB11604B6696BE426C7F46CCD1CDCCAC33A5230885E4D57E24CD365D12BEDE98BE3C350F

Second attempt
hashing value 'test' with SHA384
hash value: 84A9B12CD17583412EEC5997DB11604B6696BE426C7F46CCD1CDCCAC33A5230885E4D57E24CD365D12BEDE98BE3C350F
Diese ist auch im Archive als output.log enthalten.

Hinweise:
- ich habe schon probiert O+/O-, was bei dir intern ja die Nutzung von ASM/Pascal umschaltet: keine Änderung
- die eingefügten $Z4 sind Pflicht, da RAD2007 Studio bei Delphi Quellen in einer C++ Programm/Library die Delphi Optionen teilweise nicht weitergibt, u.a. die Enum-Grösse, was dann zu falschen DCUs führt.

Grüße,
Thomas aka Muetze1 @ mikrocontroller.net aka Muetze1 @ delphipraxis.net ;-)
Angehängte Dateien
Dateityp: zip dechashingproblem_799.zip (316,2 KB, 5x aufgerufen)
  Mit Zitat antworten Zitat