Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Der DEC x32 ASM in x64/PurePascal Konvertierungsthread (https://www.delphipraxis.net/165599-der-dec-x32-asm-x64-purepascal-konvertierungsthread.html)

hugie 6. Feb 2013 15:43

AW: Der DEC x32 ASM in x64/PurePascal Konvertierungsthread
 
Da wäre es langsam interessant, eine existierende OpenSource lib die weit verbreitet ist, via wrapper für delphi zur verfügung zu stellen.
Z.B. libgcrypt o.ä. Ist lgpl, sollte also auch in proprietärer Software einsetzbar sein.
Viele c/c++ OS Projekte sind up-to-date, häufig eingesetzt, gut geprüft etc.

Soweit ich weiß ist es doch relativ unkompliziert eine .dll oder .so via wrapper aus delphi heraus anzusprechen.
Damit würde man sich das regelmäßige neuentwickeln sparen, man müsste "nur" die api immer aktuell halten.
Ok, es ist kein PurePascal, aber sicherlich doch eine alternative Lösung zu unseren Problemen hier.

Gibt es da vielleicht schon was?

Lg

jaenicke 6. Feb 2013 16:37

AW: Der DEC x32 ASM in x64/PurePascal Konvertierungsthread
 
Ich habe in der Zwischenzeit die meisten Anpassungen selbst durchgeführt, zumindest für die Teile, die ich benötige.

Eine zusätzliche DLL wäre zwar kein echtes Problem, möchte ich aber eigentlich nicht.

Schorschi5566 2. Dez 2013 20:54

AW: Der DEC x32 ASM in x64/PurePascal Konvertierungsthread
 
Hallo zusammen,

darf man fragen ob das Projekt Dec 6.0 noch weiter verfolgt wird?

Wäre schon toll und war doch schon bald fertig, oder?

Ich habe mir auch mal die Kryptoroutinen von gammatester angesehen aber hätte da schon so meine Probleme um die von mir verwendeten DEC-Funktionen umzusetzen.

Sowas zum Beispiel:
Delphi-Quellcode:
function EncryptString(const Password: RawByteString; const Value: RawByteString): RawByteString;
var
  Salt, SessionKey: Binary;
begin
  Salt := RandomBinary(16);
  with TCipher_Rijndael.Create do
    try
      SessionKey := THash_SHA1.KDFx(Password, Salt, Context.KeySize,
        TFormat_Copy);
      mode := cmCFS8;
      Init(SessionKey);
      Result := TFormat_MIME64.Encode(Salt + EncodeBinary(Value, TFormat_Copy));
    finally
      Free;
      ProtectBinary(Salt);
      ProtectBinary(SessionKey);
    end;
end;
Weiß jemand was die Entsprechung mit den gammatester-Kryptoroutinen wäre? Geht das damit?


Grüße,
Uwe

Jens01 2. Dez 2013 21:25

AW: Der DEC x32 ASM in x64/PurePascal Konvertierungsthread
 
Also auf DEC hoffe ich nicht mehr. Ich habe das System von Gammatester erfolgreich umgestellt.
Das, was Du möchtest, sollte auch (irgendwie) funktionieren.

Ich muß bei mir gucken, Moment.

Jens01 2. Dez 2013 21:31

AW: Der DEC x32 ASM in x64/PurePascal Konvertierungsthread
 
So habe ich das gemacht. Das ist anscheinend von mir aus einem Beispiel von ihm zusammengestrickt :

Delphi-Quellcode:
function Encrypt(const AText: string; const APassword: string): string;
{ -Encrypt file InName to OutName using password }
// http://www.wolfgang-ehrhardt.de/crypt_en.html
const
  bufSize = $C000;
var
  N             : word;
  len           : int64;
  hdr           : TFCA256Hdr;
  cxe           : TAES_EAXContext;
  auth          : TFCA256_AuthBlock;
  TextOut, TextIn: TStringStream;
  buf           : array [0 .. bufSize - 1] of Byte;
begin
  randomize;
  TextIn := TStringStream.Create(AText);
  TextOut := TStringStream.Create;
  try
    len := TextIn.Size;
    GetSalt(hdr.salt);

    if FCA_EAX256_initS(cxe, APassword, hdr) <> 0 then
      raise Exception.Create('Fehler');

    TextOut.WriteBuffer(hdr, SizeOf(hdr));

    while len > 0 do
    begin
      if len > SizeOf(buf) then
        N := SizeOf(buf)
      else
        N := len;
      TextIn.ReadBuffer(buf, N);
      dec(len, N);
      if FCA_EAX256_encrypt(cxe, buf, N) <> 0 then
        raise Exception.Create('Fehler');
      TextOut.WriteBuffer(buf, N);
    end;
    FCA_EAX256_final(cxe, auth);
    TextOut.WriteBuffer(auth, SizeOf(auth));
    Result := Base64EncStr(TextOut.DataString);
  finally
    TextOut.Free;
    TextIn.Free;
  end;
end;

function Decrypt(const AText: string; const APassword: string): string;
{ -Decrypt file InName to OutName using password sPW }
// http://www.wolfgang-ehrhardt.de/crypt_en.html
const
  bufSize = $C000;
var
  N             : word;
  I, len        : longint;
  hdrk          : TFCA256Hdr;
  hdrf          : TFCA256Hdr;
  cxe           : TAES_EAXContext;
  cxh           : TFCA_HMAC256_Context;
  authf         : TFCA256_AuthBlock;
  authc         : TFCA256_AuthBlock;
  UseEAX        : boolean;
  TextOut, TextIn: TStringStream;
  buf           : array [0 .. bufSize - 1] of Byte;
begin
  if AText = '' then
    Exit('');
  TextIn := TStringStream.Create(Base64DecStr(AText));
  TextOut := TStringStream.Create;
  try
    len := TextIn.Size - SizeOf(hdrf) - SizeOf(authf);
    TextIn.ReadBuffer(hdrf, SizeOf(hdrf));

    if (hdrf.FCASig <> C_FCA_Sig) or (hdrf.Flags and $F0 <> $A0) then
      raise Exception.Create('Fehler');

    if hdrf.Flags and $02 <> 0 then
    begin
      writeln(#7'*** Warning: Found zlib compression flag, use t_zlibex to inflate <outfile>');
    end;

    if not(hdrf.Flags and $04 <> 0) then
    begin
      raise Exception.Create('Fehler');
    end;

    hdrk  := hdrf;
    UseEAX := odd(hdrf.Flags);
    if UseEAX then
    begin
      if FCA_EAX256_initS(cxe, APassword, hdrk) <> 0 then
        raise Exception.Create('Fehler');
    end
    else
    begin
      if FCA_HMAC256_initS(cxh, APassword, hdrk) <> 0 then
        raise Exception.Create('Fehler');
    end;
    if hdrf.PW_ver <> hdrk.PW_ver then
      raise Exception.Create('Fehler');

    while len > 0 do
    begin
      if len > SizeOf(buf) then
        N := SizeOf(buf)
      else
        N := len;
      TextIn.ReadBuffer(buf, N);
      dec(len, N);
      if UseEAX then
      begin
        if FCA_EAX256_decrypt(cxe, buf, N) <> 0 then
          raise Exception.Create('Fehler');
      end
      else
      begin
        if FCA_HMAC256_decrypt(cxh, buf, N) <> 0 then
          raise Exception.Create('Fehler');
      end;
      TextOut.WriteBuffer(buf, N);
    end;
    if UseEAX then
    begin
      FCA_EAX256_final(cxe, authc);
    end
    else
    begin
      FCA_HMAC256_final(cxh, authc);
    end;
    TextIn.ReadBuffer(authf, SizeOf(authf));
    for I := 0 to 15 do
    begin
      if authf[I] <> authc[I] then
      begin
        raise Exception.Create('Fehler');
      end;
    end;
    Result := TextOut.DataString;
  finally
    TextOut.Free;
    TextIn.Free;
  end;
end;

Schorschi5566 2. Dez 2013 21:35

AW: Der DEC x32 ASM in x64/PurePascal Konvertierungsthread
 
Hallo Jens01,

vielen Dank. Werde ich mal ausprobieren.

Schade, wenn das mit DEC nichts mehr werden sollte. Ist ja doch um Einiges einfacher anzuwenden...


Grüße,
Uwe

Jens01 2. Dez 2013 21:38

AW: Der DEC x32 ASM in x64/PurePascal Konvertierungsthread
 
Zitat:

Ist ja doch um Einiges einfacher anzuwenden...
Glaube ich gar nicht. Man muß sich nur noch mal durch diese nicht so einfache Routinen durcharbeiten. Bei DEC hast Du das wahrscheinlich schon gemacht.
Gammatester ist aber öfter mal hier im Forum.

JamesTKirk 3. Dez 2013 06:42

AW: 256 bit Integer Addition von ASM in PurePascal
 
Zitat:

Zitat von Assertor (Beitrag 1144891)
Das läuft in x64 Delphi, das RDX Register scheint dem FPC x64 Compiler aber nicht zu gefallen:
Zitat:

Error: Unknown identifier "RDX"
Gleich in der ersten Zeile bei SHL RDX, 3.

Nun gut, ich kenne FPC nicht weiter, möglicherweise ist dies bekannt und über Defines steuerbar. Ggf bleibt dort der Weg über PurePascal, was wegen der breiteren Unterstützung ja mit o.g. Delphi Code möglich ist.

Ist zwar schon ne Weile her der Post, aber dennoch sollte man erklären woran es hier hakt: FPC arbeitet standardmäßig im AT&T Syntax Modus, wobei register mit einem "%"-Prefix benannt sind und noch dazu Source und Destination Register vertauscht sind. Will man den Intel Modus verwenden (der für i386 und x86_64 unterstützt ist), so muss man eine
Delphi-Quellcode:
{$asmmode intel}
Direktive einfügen.

Eine Anmerkung noch zu Calling Conventions: diese sind unter x86_64-win64 und x86_64-[alles andere] unterschiedlich. Letztere verwenden die Linux x86_64 ABI während nur Windows hier sein eigenes Süppchen kocht. Für FPC würde ich dennoch eine PurePascal Implementierung vorziehen, da es ja noch einige Plattformen mehr gibt (Achtung: auch mit unterschiedlicher Endianess!).

Gruß,
Sven

gammatester 3. Dez 2013 07:45

AW: Der DEC x32 ASM in x64/PurePascal Konvertierungsthread
 
Zitat:

Zitat von Schorschi5566 (Beitrag 1238277)
Delphi-Quellcode:
      SessionKey := THash_SHA1.KDFx(Password, Salt, Context.KeySize,
        TFormat_Copy);
      mode := cmCFS8;
Weiß jemand was die Entsprechung mit den gammatester-Kryptoroutinen wäre? Geht das damit?

Das geht so überhaupt nicht! Es liegt aber nicht an meinen Routinen, sondern an den häufigen selbstgestrickten DEC-Routinen:
Zitat:

class function TDECHash.KDFx
// DEC's own KDF, even stronger
oder die selbstgebastelten Betriebsmodi, die zwar gut gemeint und wahrscheinlich auch sicher sind, allerdings mit nichts und niemand in der restlichen Welt kompatibel.

jaenicke 3. Dez 2013 08:27

AW: 256 bit Integer Addition von ASM in PurePascal
 
Zitat:

Zitat von JamesTKirk (Beitrag 1238299)
Eine Anmerkung noch zu Calling Conventions: diese sind unter x86_64-win64 und x86_64-[alles andere] unterschiedlich. Letztere verwenden die Linux x86_64 ABI während nur Windows hier sein eigenes Süppchen kocht.

Genau genommen fällt UEFI aus dem "alles andere" auch heraus und nutzt die selbe Konvention wie Windows.

Schorschi5566 3. Dez 2013 16:12

AW: Der DEC x32 ASM in x64/PurePascal Konvertierungsthread
 
Hallo gammatester,

Zitat:

Zitat von gammatester (Beitrag 1238305)
Das geht so überhaupt nicht! Es liegt aber nicht an meinen Routinen, sondern an den häufigen selbstgestrickten DEC-Routinen:

Ok, verstehe. Ist zwar schlecht, weil's dann wohl darauf rausläuft, dass ich sämtliche Programme, die ich künftig noch pflegen muss und die irgendwo diese Routine verwendet haben um irgendwas zu verschlüsseln, in einer 32-Bit-Version auf ein neues Verfahren umkonvertieren muss um dann in einer künftigen 64-Bit-Version mit beispielsweise Deinen Routinen zu arbeiten. Das wird kein Spaß. :(

Wie sieht's denn damit aus? Das ist zumindest auch unter (beispielsweise) PHP verwendbar...
Delphi-Quellcode:
function EncryptStringForPHP(Text, Password: RawByteString): RawByteString;
var
  Salt : Binary;
begin
  Salt := RandomBinary(8);
  with TCipher_Blowfish.Create do
    try
      mode := cmCFB8;
      Init(Password, Salt, Context.KeySize);
      Result := TFormat_MIME64.Encode(Salt + EncodeBinary(Text, TFormat_Copy));
    finally
      Free;
      ProtectBinary(Salt);
      ProtectBinary(Password);
    end;
end;
Grüße,
Uwe

Schorschi5566 3. Dez 2013 16:31

AW: 256 bit Integer Addition von ASM in PurePascal
 
Hallo Sven,

Zitat:

Zitat von JamesTKirk (Beitrag 1238299)
Ist zwar schon ne Weile her der Post, aber dennoch sollte man erklären woran es hier hakt: FPC arbeitet standardmäßig im AT&T Syntax Modus, wobei register mit einem "%"-Prefix benannt sind und noch dazu Source und Destination Register vertauscht sind. Will man den Intel Modus verwenden (der für i386 und x86_64 unterstützt ist), so muss man eine
Delphi-Quellcode:
{$asmmode intel}
Direktive einfügen.

Hakt es jetzt also daran, dass die DEC 6.0 kompatibel zu FPC werden soll oder daran, dass weiterhin Assembler verwendet werden soll? Oder wie?

Oder anders gefragt: Wäre eine 64-Bit-Version für Delphi unter Windows machbar oder ist gar schon lauffähig?

Also für den Moment wäre Vielen sicherlich schon mit einer DEC 5.9 geholfen, die mit Delphi unter 64-Bit so funktioniert, wie die DEC 5.2 unter 32-Bit, denke ich mal.

Vielleicht sollte man ja erstmal diesen Teilschritt realisieren.


Grüße,
Uwe

JamesTKirk 4. Dez 2013 06:41

AW: 256 bit Integer Addition von ASM in PurePascal
 
Zitat:

Zitat von jaenicke (Beitrag 1238307)
Zitat:

Zitat von JamesTKirk (Beitrag 1238299)
Eine Anmerkung noch zu Calling Conventions: diese sind unter x86_64-win64 und x86_64-[alles andere] unterschiedlich. Letztere verwenden die Linux x86_64 ABI während nur Windows hier sein eigenes Süppchen kocht.

Genau genommen fällt UEFI aus dem "alles andere" auch heraus und nutzt die selbe Konvention wie Windows.

1. bezog sich mein x86_64-[alles andere] eigentlich auf die anderen von Free Pascal unterstützten Betriebssysteme unter x86_64
2. war ja wohl Microsoft sehr stark an UEFI beteiligt, was man auch daran sehen kann, dass Portable Executable als Binärformat gewählt wurde...

Zitat:

Zitat von Schorschi5566 (Beitrag 1238388)
Hakt es jetzt also daran, dass die DEC 6.0 kompatibel zu FPC werden soll oder daran, dass weiterhin Assembler verwendet werden soll? Oder wie?

Ich denke es hakt weniger daran, dass DEC 6.0 FPC kompatibel werden soll (was ich durchaus begrüßen würde, aber ich denke das ist ein längerfristiges Ziel), sondern eher daran, dass Assertor nicht so viel Zeit in DEC investieren kann, wie er vielleicht gerne möchte.

Zitat:

Zitat von Schorschi5566 (Beitrag 1238388)
Oder anders gefragt: Wäre eine 64-Bit-Version für Delphi unter Windows machbar oder ist gar schon lauffähig?

Wenn du dir den Thread Der DEC x32 ASM in x64/PurePascal Konvertierungsthread, dann scheint es schon prinzipiell voran gekommen zu sein, aber es ist wohl noch nicht vollständig. Für mehr Details müsstest du dich aber wohl an Assertor wenden.

Gruß,
Sven

gammatester 4. Dez 2013 08:08

AW: Der DEC x32 ASM in x64/PurePascal Konvertierungsthread
 
Zitat:

Zitat von Schorschi5566 (Beitrag 1238384)
Wie sieht's denn damit aus? Das ist zumindest auch unter (beispielsweise) PHP verwendbar...
Delphi-Quellcode:
function EncryptStringForPHP(Text, Password:
//...
with TCipher_Blowfish.Create do
    try
      mode := cmCFB8;
      Init(Password, Salt, Context.KeySize);
      Result := TFormat_MIME64.Encode(Salt + EncodeBinary(Text, TFormat_Copy));

Mein Blowfish-CFB arbeitet mit Blockgröße; die einzige Chiffre, die CFB8 unterstützt, ist auf spezielle Useranfrage AES. Wenn es denn unbedingt das ineffektive CFB8 sein muß (eigentlich für langsame byteweise Übertragung gedacht), kann man als Vorlage die beiden kleinen AES-Funktionen aus aes_cfb8.pas nehmen.

Schorschi5566 4. Dez 2013 18:16

AW: Der DEC x32 ASM in x64/PurePascal Konvertierungsthread
 
Hallo gammatester,

Zitat:

Zitat von gammatester (Beitrag 1238452)
Wenn es denn unbedingt das ineffektive CFB8 sein muß (eigentlich für langsame byteweise Übertragung gedacht), kann man als Vorlage die beiden kleinen AES-Funktionen aus aes_cfb8.pas nehmen.

Nein, muss es nicht unbedingt sein. War nur die erste Funktion, die ich damals so unter Delphi und PHP zum Laufen gebracht habe...:stupid:

Ich habe Dir mal 'ne PM geschickt.


Grüße,
Uwe

JamesTKirk 4. Dez 2013 21:51

AW: 256 bit Integer Addition von ASM in PurePascal
 
Zitat:

Zitat von JamesTKirk (Beitrag 1238444)
Zitat:

Zitat von Schorschi5566 (Beitrag 1238388)
Oder anders gefragt: Wäre eine 64-Bit-Version für Delphi unter Windows machbar oder ist gar schon lauffähig?

Wenn du dir den Thread Der DEC x32 ASM in x64/PurePascal Konvertierungsthread, dann scheint es schon prinzipiell voran gekommen zu sein, aber es ist wohl noch nicht vollständig. Für mehr Details müsstest du dich aber wohl an Assertor wenden.

Man merkt, dass ich das heute früh geschrieben habe, da ich um die Uhrzeit nicht gemerkt habe, dass es sich hierbei ja um die beiden selben Threads handelt... :oops:

Gruß,
Sven

gammatester 5. Dez 2013 08:27

AW: Der DEC x32 ASM in x64/PurePascal Konvertierungsthread
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Schorschi5566 (Beitrag 1238533)
Zitat:

Zitat von gammatester (Beitrag 1238452)
... kann man als Vorlage die beiden kleinen AES-Funktionen aus aes_cfb8.pas nehmen.

... War nur die erste Funktion, die ich damals so unter Delphi und PHP zum Laufen gebracht habe...

Gestern abend habe ich die Routinen nach dem Rezept erstellt und hänge sie hier an (falls mehr Interessenten gibt) mit Testprogrammen für DEC und die Unit, beide liefern byte-identische Ergebnisse. Ein großes Problem ist, das es offensichtliche keine oder nur sehr schwierig zu findende veröffentlichte Testvektoren für Blowfish-CFB8 gibt.

a.def 5. Mai 2017 22:43

AW: Der DEC x32 ASM in x64/PurePascal Konvertierungsthread
 
Ja, der Thread ist alt!

Ich habe nur eine Frage. Ich versuche gerade DEC 5.2 x64 zu kompilieren was natürlich schief geht. Ich habe bisher alles angepasst, was man hier in diesem Thread finden konnte.
Aber leider ist die Unit DECUtil noch voll von nicht funktionierendem ASM-Code.

Gibt es dafür eine Lösung bzw. gibt es eine schnelle DEC-Alternative? System.Hash ist mir zu lahm und Spring4D weiß ich leider nicht anzuwenden :pale:

Rollo62 6. Mai 2017 06:34

AW: Der DEC x32 ASM in x64/PurePascal Konvertierungsthread
 
Habs lange nicht benutzt, aber LockBox war eigentlich super für solche Dinge, zumindest für mich ...
Warum benutzt du nicht das ?

Rollo

a.def 6. Mai 2017 15:36

AW: Der DEC x32 ASM in x64/PurePascal Konvertierungsthread
 
Wie installiert man LockBox denn nicht einmal das schaffe ich.
Sieht super umständlich aus finde ich.

Muetze1 29. Jan 2018 12:46

AW: Der DEC x32 ASM in x64/PurePascal Konvertierungsthread
 
Wollen wir hier vielleicht noch einmal alles zusammentragen bezüglich der DEC? Ich habe z.B. die TypeInfoEx.pas auf 64 Bit angepasst mit dem Assembler. Eine Pure Pascal Implementation könnte man ansonsten ja vielleicht auch noch einmal erstellen. Besteht noch Interesse oder ist das eh tot? Gleiches gilt für die Fehler durch die DEC Assembler Routinen bei der Nutzung unter C++Builder.

Luckie 29. Jan 2018 18:11

AW: Der DEC x32 ASM in x64/PurePascal Konvertierungsthread
 
Ich habe das noch auf meiner Webseite: http://michael-puff.de/Programmierung/Delphi/DEC/

Fukiszo 29. Jan 2018 18:31

AW: Der DEC x32 ASM in x64/PurePascal Konvertierungsthread
 
Schade das es nicht weiterentwickelt wurde (DP Thread Vorschläge für Version 5.3) Da steht auch sehr oft sogar Planung einer Version 6 und 64bit Unterstützung.
Zu Windows XP Zeiten fand ich DEC echt gut.

TurboMagic 17. Sep 2020 20:52

AW: Der DEC x32 ASM in x64/PurePascal Konvertierungsthread
 
Dass es nicht weiterentwickelt wird stimmt gar nicht ;-)
Ich tue das doch. Siehe development Zweit in Assertor's repository.
Wenn der jetzt mal endlich erreichbar wäre und mir das Repository ganz übertragen würde,
dann gäb's wohl in absehbarer Zeit eine V6.0.

Eine Liste der Änderungen von 5.2/5.3 nach 6.0 befindet sich in der Doku, die jetzt bei
DEC auch dabei ist ganz am Ende.

Es wäre allerdings hilfreich, wenn mir jemand noch den Zweck gewisser Dinge erläutern würde.
Beispielsweise wozu sind diese gut:

- TDECCipher: Fuser, FUserSave und FVector
- TCipherContext.UserSave

Und für nach 6.0 ist auch geplant neuere Algorithmen schrittweise umzusetzen.
Es dürfen sich aber auch genre weitere Personen beteiligen!

Ach ja, 2 FMX basierte Testprogramme gibt's auch in Google Play zum Download:
DECHashDemo und DECCipherDemo.

Grüße
TurboMagic


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:15 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz