Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   Fast Base64 encoding/decoding (https://www.delphipraxis.net/213082-fast-base64-encoding-decoding.html)

rabatscher 20. Mai 2023 14:33

Fast Base64 encoding/decoding
 
Nachdem ich über ein interessantes Paper bezüglich Base64 encoding/decoding gestolpert bin musste ich das
einfach in Delphi implementieren:

https://github.com/mikerabat/fastbase64/

Das Projekt nutzt AVX2 Assembler Instruktionen um Base64 zu kodieren und dekodieren
-> gegenüber Indy ist das Ding ca 10x Schneller (getested mit einem cor i7-1065G7)

Das Projekt bzw. die Codierroutinen sollten bis Delphi 2010 benutzbar sein sowie auch
für FPC basierte Umgebungen.

TurboMagic 21. Mai 2023 14:23

AW: Fast Base64 encoding/decoding
 
Hallo,

nette Sache!

Würde was dagegen sprechen, dass ich das mal irgendwann als Option
in DEC https://github.com/MHumm/DelphiEncryptionCompendium
als Alternative zum dort vorhandenen Base64 einbaue?

Ansonsten: schon gesehen, dass es in Delphi's System.pas auch ein GetCPUID und System.CPUIDTable gibt?

Grüße
TurboMagic

rabatscher 21. Mai 2023 21:18

AW: Fast Base64 encoding/decoding
 
Absolut nicht :)

und nein ich hab die CPUID Funktionen noch nicht gesehen ;) allerdings brauchte ich die noch nie,
da meine Projekte ja doch etwas rückwärtskompatibel sein sollten und meine
Implementierungen zumindest bis Delphi2010 funktionieren sollten.
(was das Base64 Projekt auch tut ;) )

Ach ja.. für DEC hätte meine andere Lib auf https://github.com/mikerabat/mrmath einen
ChaCha (Salsa20) basierten Zufallsgenerator (AVX und SEE Implementierungen). Evt könnte man dort
aus dem Basisalgorithmus einen Cipher basteln. Ich habs mir kurz mal angesehen aber
konnte es in DEC nicht wirklich unterbringen.... (Wir würdens gern mal benutzen ;) )

himitsu 21. Mai 2023 21:41

AW: Fast Base64 encoding/decoding
 
Dafür kannst oben einen eigenen Fallback einbauen:
Delphi-Quellcode:
{$IF not Declared(GetCPUID)}
type
  TCPUIDRec = record
    EAX, EBX, ECX, EDX: UInt32;
  end;

function IsCPUIDAvailable: Boolean;
begin
  ...
end;

//function GetCPUID(FunctionID: UInt32; SubFunctionID: UInt32 = 0): TCPUIDRec; // EAX=FunctionID, ECX=SubFunctionID
// Eigentlich so, aber Kürzer passt auch.
function GetCPUID(FunctionID: UInt32): TCPUIDRec; // EAX=FunctionID
asm
  ...
end;
{$IFEND}

Warum sind viele Konstenten im FastBase64 anstatt in FastBase64Const?

rabatscher 21. Mai 2023 22:36

AW: Fast Base64 encoding/decoding
 
Die Konstanten sind nur für die Fallback Dekodierung in FastBase64 gedacht - das ist so ca die gleiche Routine, die
auch Chormium benutzt... die Constanten unit wird in den AVX units benutzt.

If declared kannte ich nicht... werds mal ausprobieren ;)

TurboMagic 22. Mai 2023 07:42

AW: Fast Base64 encoding/decoding
 
Zitat:

Zitat von rabatscher (Beitrag 1522678)
Absolut nicht :)

und nein ich hab die CPUID Funktionen noch nicht gesehen ;) allerdings brauchte ich die noch nie,
da meine Projekte ja doch etwas rückwärtskompatibel sein sollten und meine
Implementierungen zumindest bis Delphi2010 funktionieren sollten.
(was das Base64 Projekt auch tut ;) )

Ach ja.. für DEC hätte meine andere Lib auf https://github.com/mikerabat/mrmath einen
ChaCha (Salsa20) basierten Zufallsgenerator (AVX und SEE Implementierungen). Evt könnte man dort
aus dem Basisalgorithmus einen Cipher basteln. Ich habs mir kurz mal angesehen aber
konnte es in DEC nicht wirklich unterbringen.... (Wir würdens gern mal benutzen ;) )

Interessant, dass du so dinen ChaCha/SalSa20 Zufallsgenerator hast.
Es gibt ja ChaCha und SalSa als Stromchiffre und die könnte man sehr gerne in DEC unterbringen.
Es wäre auch nicht die erste Stromchiffre in DEC! z.B. ist ja schon RC4 enthalten.
Die Frage wäre, wass denn so anders an ChaCHa/SalSa wäre, dass man es nicht in die DEC Architektur
einbringen könnte? Es sollte halt so sein, dass es davon auch eine Pure Pascal Version gibt,
für Plattformen die nicht auf Intel ASM zurückgreifen können. Dafür könnte man vermutlich
die Umsetzungen von Wolfgang Erhardt benutzen, die ich noch als Kopie vorliegen habe. Nur hatte
ich dafür noch keine Zeit und sein Code ist leider Turbo Pascal kompatibel prozedurmäßig
geschrieben...

Außerdem müsste man sich noch defines überlegen mit denen man ggf. händisch steuern kann,
welche Variante zum Einsatz kommen soll, u.a. auch damit man all Code Pfade testen kann.

Könnten wir da irgendwie "ins Geschäft kommen"? ;-)
Da dein Code unter APL 2.0 steht ist das auch gar kein Problem, denn DEC ist auch APL 2.0.
Und selbstverständlich würdest du in der Liste der Beitragenden gelistet... ;-)

Grüße
TurboMagic

rabatscher 22. Mai 2023 08:15

AW: Fast Base64 encoding/decoding
 
Die Unit RandomEng.pas beinhaltet Chacha routinen in Pascal und SSE. Die AVX und SSE versionen wurden in separate files
ausgelagert, damit mein Tool, das die AVX codes ordentlich in DB Statements gewandelt werden können.

Die Cipher definiert die Initstruktur etwas anders - die Key und die letzten 2-3 Longwords werden etwas anders gehandelt. Ausserdem
kenne ich mich mit dem Keyaustausch nicht aus...

TurboMagic 22. Mai 2023 09:35

AW: Fast Base64 encoding/decoding
 
Zitat:

Zitat von rabatscher (Beitrag 1522684)
Die Unit RandomEng.pas beinhaltet Chacha routinen in Pascal und SSE. Die AVX und SSE versionen wurden in separate files
ausgelagert, damit mein Tool, das die AVX codes ordentlich in DB Statements gewandelt werden können.

Die Cipher definiert die Initstruktur etwas anders - die Key und die letzten 2-3 Longwords werden etwas anders gehandelt. Ausserdem
kenne ich mich mit dem Keyaustausch nicht aus...

Das könnte man aber doch erarbeiten...
Rom wurde auch nicht an einem Tag gebaut!
Ich biete auch gerne einen Branch und Commit Rechte an...

rabatscher 22. Mai 2023 11:46

AW: Fast Base64 encoding/decoding
 
Ok super - ich würde mal mit nem einfachen checkout von DEC von Github starten und mich mal anfangen durchzuwurschteln...

TurboMagic 22. Mai 2023 12:13

AW: Fast Base64 encoding/decoding
 
Zitat:

Zitat von rabatscher (Beitrag 1522689)
Ok super - ich würde mal mit nem einfachen checkout von DEC von Github starten und mich mal anfangen durchzuwurschteln...

Klingt gut! Und wenn du Fragen zur Struktur hast oder auch andere, gerne melden! Und mal in die mitgelieferte Doku schauen...
Da sind auch Klassenhierarchie Diagramme drin.. :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:56 Uhr.

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