Hi zusammen,
ich komme nicht mehr weiter und brauche mal Tipps von euch. Direkt vorweg: "ja, du musst ja auch die 64-Bit-
DLL nehmen, wenn du für 64-Bit kompilierst!" werden vielleicht einige direkt zurecht antworten wollen. Ja, habe ich. Ganz so einfach ist es leider nicht. Geht noch nicht mal um meinen eigenen Code, sondern um eine Bibliothek, die ich nutzen möchte. Aber der Reihe nach:
Wenn man sich mit "modernen" Anmeldeverfahren im Netz rumschlägt, dann stolpert man irgendwann über OAuth2 und die "
Access Token" und "Identity Token", die man da so bekommt. Meistens liegen diese Token in Form eines "JSON Web Tokens" vor, welche diverse Informationen über die Anmeldung enthalten und schließlich auch mit einem Zertifikat signiert sind, mit dem man die Echtheit prüfen kann und soll. Damit man nicht bei Null anfangen muss, wenn man so ein Token auswerten und prüfen will, haben andere zum Glück schon vorgearbeitet, in dem Fall gibt es u.a. die
Delphi JOSE and JWT Library von Paolo Rossi. Hier ist vor allem auch die ganze Zertifikatsprüfung mit eingebaut und die basiert zum Teil wiederum auf OpenSSL.
Und hier kommt es nun zu meinem Problem. Folgender Code aus der
Unit JOSE.Signing.RSA von Paolo:
Delphi-Quellcode:
unit JOSE.Signing.RSA;
interface
uses
[...]IdSSLOpenSSLHeaders,
[...]
class procedure TRSA.LoadOpenSSL;
begin
if not IdSSLOpenSSLHeaders.Load
then
raise Exception.Create('
[RSA] Unable to load OpenSSL libraries');
if @EVP_DigestVerifyInit =
nil then
raise Exception.Create('
[RSA] Please, use OpenSSL 1.0.0. or newer!');
if GetCryptLibHandle <> 0
then
begin
// *** Die folgende Zeile macht nicht, was sie soll! ***
_PEM_read_bio_RSA_PUBKEY := GetProcAddress(GetCryptLibHandle, '
PEM_read_bio_RSA_PUBKEY');
if @_PEM_read_bio_RSA_PUBKEY =
nil then
raise Exception.Create('
[RSA] Unable to get proc address for "PEM_read_bio_RSA_PUBKEY"');
[...]
end;
end;
Hier soll also
GetProcAddress(GetCryptLibHandle, 'PEM_read_bio_RSA_PUBKEY')
in der libeay32.dll die Funktion PEM_read_bio_RSA_PUBKEY finden. Die Funktion
GetCryptoLibHandle
kommt aus der
Indy-
Unit IdSSLOpenSSLHeaders und liefert das
Handle auf die libeay32.dll. Unter
Win32 funktioniert das auch alles ganz wunderbar. Unter Win64 bekomme ich immer ein NIL von der Funktion.
Mit einem "
DLL Export Viewer" habe ich gesehen, dass die gesuchte Funktion in der
DLL auch tatsächlich existiert. Mit dem ProcessMonitor habe ich geprüft, dass auch tatsächlich die richtige, 64 bittige Version von libeay32.dll geladen wird. Wird sie ohnehin schon vorher, weil das ganze in einer Web Broker-Anwendung läuft, die auch auf OpenSSL zugreift. Da kann man beim Debuggen dann auch sehen, dass die ganzen Funktionen auch unter Win64 in der
dll problemlos gefunden werden, wenn man sich die Funktion "Load" in der IdSSLOpenSSLHeaders anguckt und da einen Breakpoint setzt. Nur oben klappt es nicht.
Ich hab auch schon mal
@_PEM_read_bio_RSA_PUBKEY := GetProcAddress(GetCryptLibHandle, PChar('PEM_read_bio_RSA_PUBKEY'));
probiert, aber das brachte keinen Unterschied.
Hat irgendwer irgendeine Idee?
(Zur Info: hab das auch in einem
Issue auf Github gepostet, weil dort schon jemand ein ähnliches Problem mit Mac32/Mac64 hatte)