mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-16 13:19:12 +02:00
* LibreSSL support
git-svn-id: trunk@46987 -
(cherry picked from commit ce3335affe
)
This commit is contained in:
parent
94e73c7285
commit
f7782245fd
@ -84,30 +84,27 @@ uses
|
|||||||
{$ENDIF OS2}
|
{$ENDIF OS2}
|
||||||
DynLibs, cTypes, SysUtils;
|
DynLibs, cTypes, SysUtils;
|
||||||
|
|
||||||
var
|
Type
|
||||||
{$IFDEF WINDOWS}
|
TLibreSSLSupport = (lssFirst,lssLast,lssDisabled);
|
||||||
DLLSSLName: string = 'ssleay32.dll';
|
|
||||||
DLLSSLName2: string = 'libssl32.dll';
|
|
||||||
DLLSSLName3: string = {$IFDEF WIN64}'libssl-1_1-x64.dll'{$ELSE}'libssl-1_1.dll'{$ENDIF};
|
|
||||||
DLLUtilName: string = 'libeay32.dll';
|
|
||||||
DLLUtilName2: string = {$IFDEF WIN64}'libcrypto-1_1-x64.dll'{$ELSE}'libcrypto-1_1.dll'{$ENDIF};
|
|
||||||
{$ELSE}
|
|
||||||
{$IFDEF OS2}
|
|
||||||
{$IFDEF OS2GCC}
|
|
||||||
DLLSSLName: string = 'kssl10.dll';
|
|
||||||
DLLUtilName: string = 'kcrypt10.dll';
|
|
||||||
DLLSSLName2: string = 'kssl.dll';
|
|
||||||
DLLUtilName2: string = 'kcrypto.dll';
|
|
||||||
{$ELSE OS2GCC}
|
|
||||||
DLLSSLName: string = 'emssl10.dll';
|
|
||||||
DLLUtilName: string = 'emcrpt10.dll';
|
|
||||||
DLLSSLName2: string = 'ssl.dll';
|
|
||||||
DLLUtilName2: string = 'crypto.dll';
|
|
||||||
{$ENDIF OS2GCC}
|
|
||||||
{$ELSE OS2}
|
|
||||||
DLLSSLName: string = 'libssl';
|
|
||||||
DLLUtilName: string = 'libcrypto';
|
|
||||||
|
|
||||||
|
const
|
||||||
|
// SSL and Crypto DLL arrays must have the same length and contain
|
||||||
|
// matched pairs of DLL filenames. Place newer versions at the beginning.
|
||||||
|
{$IFDEF WIN64}
|
||||||
|
SSL_DLL_Names: array[1..3] of string = ('libssl-1_1-x64', 'ssleay32', 'libssl32');
|
||||||
|
Crypto_DLL_Names: array[1..3] of string = ('libcrypto-1_1-x64', 'libeay32', 'libeay32');
|
||||||
|
{$ELSEIF DEFINED(WINDOWS)}
|
||||||
|
SSL_DLL_Names: array[1..3] of string = ('libssl-1_1', 'ssleay32', 'libssl32');
|
||||||
|
Crypto_DLL_Names: array[1..3] of string = ('libcrypto-1_1', 'libeay32', 'libeay32');
|
||||||
|
{$ELSEIF DEFINED(OS2GCC)}
|
||||||
|
SSL_DLL_Names: array[1..2] of string = ('kssl10', 'kssl');
|
||||||
|
Crypto_DLL_Names: array[1..2] of string = ('kcrypt10', 'kcrypto');
|
||||||
|
{$ELSEIF DEFINED(OS2)}
|
||||||
|
SSL_DLL_Names: array[1..2] of string = ('emssl10', 'ssl');
|
||||||
|
Crypto_DLL_Names: array[1..2] of string = ('emcrpt10', 'crypto');
|
||||||
|
{$ELSE}
|
||||||
|
BaseSSLName: string = 'libssl';
|
||||||
|
BaseCryptoName: string = 'libcrypto';
|
||||||
{ ADD NEW ONES WHEN THEY APPEAR!
|
{ ADD NEW ONES WHEN THEY APPEAR!
|
||||||
Always make .so/dylib first, then versions, in descending order!
|
Always make .so/dylib first, then versions, in descending order!
|
||||||
Add "." .before the version, first is always just "" }
|
Add "." .before the version, first is always just "" }
|
||||||
@ -115,8 +112,21 @@ var
|
|||||||
'.1.0.2', '.1.0.1','.1.0.0','.0.9.8',
|
'.1.0.2', '.1.0.1','.1.0.0','.0.9.8',
|
||||||
'.0.9.7', '.0.9.6', '.0.9.5', '.0.9.4',
|
'.0.9.7', '.0.9.6', '.0.9.5', '.0.9.4',
|
||||||
'.0.9.3', '.0.9.2', '.0.9.1');
|
'.0.9.3', '.0.9.2', '.0.9.1');
|
||||||
{$ENDIF OS2}
|
LibreSSLVersions : Array[1..8] of string =
|
||||||
{$ENDIF WINDOWS}
|
('', '.48', '.47', '.46', '.45', '.44', '.43', '.35');
|
||||||
|
|
||||||
|
// Mac OS no longer allows you to load the unversioned one. Bug ID 36484.
|
||||||
|
{$IFDEF DARWIN}
|
||||||
|
StartVersionOffset = 1;
|
||||||
|
DefaultLibreSSLSupport = lssFirst;
|
||||||
|
{$ElSE}
|
||||||
|
StartVersionOffset = 0;
|
||||||
|
DefaultLibreSSLSupport = lssLast;
|
||||||
|
{$ENDIF}
|
||||||
|
|
||||||
|
Var
|
||||||
|
LibreSSLSupport : TLibreSSLSupport = DefaultLibreSSLSupport;
|
||||||
|
{$ENDIF}
|
||||||
|
|
||||||
const
|
const
|
||||||
// EVP.h Constants
|
// EVP.h Constants
|
||||||
@ -4827,42 +4837,6 @@ begin
|
|||||||
_OPENSSLaddallalgorithms;
|
_OPENSSLaddallalgorithms;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{$IFNDEF WINDOWS}
|
|
||||||
{$IFNDEF OS2}
|
|
||||||
{ Try to load all library versions until you find or run out }
|
|
||||||
function LoadLibHack(const Value: String): HModule;
|
|
||||||
var
|
|
||||||
i: cInt;
|
|
||||||
begin
|
|
||||||
Result := NilHandle;
|
|
||||||
|
|
||||||
for i := Low(DLLVersions) to High(DLLVersions) do begin
|
|
||||||
{$IFDEF DARWIN}
|
|
||||||
Result := LoadLibrary(Value + DLLVersions[i] + '.dylib');
|
|
||||||
{$ELSE}
|
|
||||||
Result := LoadLibrary(Value + '.so' + DLLVersions[i]);
|
|
||||||
{$ENDIF}
|
|
||||||
|
|
||||||
if Result <> NilHandle then
|
|
||||||
Break;
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
{$ENDIF OS2}
|
|
||||||
{$ENDIF WINDOWS}
|
|
||||||
|
|
||||||
function LoadLib(const Value: String): HModule;
|
|
||||||
begin
|
|
||||||
{$IFDEF WINDOWS}
|
|
||||||
Result := LoadLibrary(Value);
|
|
||||||
{$ELSE WINDOWS}
|
|
||||||
{$IFDEF OS2}
|
|
||||||
Result := LoadLibrary(Value);
|
|
||||||
{$ELSE OS2}
|
|
||||||
Result := LoadLibHack(Value);
|
|
||||||
{$ENDIF OS2}
|
|
||||||
{$ENDIF WINDOWS}
|
|
||||||
end;
|
|
||||||
|
|
||||||
Function CheckOK(ProcName : string ) : string;
|
Function CheckOK(ProcName : string ) : string;
|
||||||
|
|
||||||
|
|
||||||
@ -5278,19 +5252,6 @@ begin
|
|||||||
_BN_free:=GetProcAddr(SSLUtilHandle,'BN_free');
|
_BN_free:=GetProcAddr(SSLUtilHandle,'BN_free');
|
||||||
end;
|
end;
|
||||||
|
|
||||||
Function LoadUtilLibrary : Boolean;
|
|
||||||
|
|
||||||
begin
|
|
||||||
Result:=(SSLUtilHandle<>0);
|
|
||||||
if not Result then
|
|
||||||
begin
|
|
||||||
SSLUtilHandle := LoadLib(DLLUtilName);
|
|
||||||
Result:=(SSLUtilHandle<>0);
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Procedure ClearSSLEntryPoints;
|
Procedure ClearSSLEntryPoints;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
@ -5449,26 +5410,6 @@ begin
|
|||||||
_BN_free:=nil;
|
_BN_free:=nil;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
Procedure UnloadSSLLib;
|
|
||||||
|
|
||||||
begin
|
|
||||||
if (SSLLibHandle<>0) then
|
|
||||||
begin
|
|
||||||
FreeLibrary(SSLLibHandle);
|
|
||||||
SSLLibHandle:=0;
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
|
|
||||||
Procedure UnloadUtilLib;
|
|
||||||
|
|
||||||
begin
|
|
||||||
if (SSLUtilHandle<>0) then
|
|
||||||
begin
|
|
||||||
FreeLibrary(SSLUtilHandle);
|
|
||||||
SSLUtilHandle := 0;
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
|
|
||||||
Procedure ClearUtilEntryPoints;
|
Procedure ClearUtilEntryPoints;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
@ -5694,32 +5635,89 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function TryLoadLibPair(const SSL_DLL_Name, Crypto_DLL_Name: string):boolean;
|
||||||
|
begin
|
||||||
|
Assert((SSLUtilHandle = 0) and (SSLLibHandle = 0),
|
||||||
|
'LoadTryLoadLibPair: Handle is not zero');
|
||||||
|
|
||||||
|
SSLUtilHandle := LoadLibrary(Crypto_DLL_Name);
|
||||||
|
if (SSLUtilHandle <> 0) then
|
||||||
|
SSLLibHandle := LoadLibrary(SSL_DLL_Name);
|
||||||
|
|
||||||
|
Result := (SSLUtilHandle <> 0) and (SSLLibHandle <> 0);
|
||||||
|
if not Result then UnloadLibraries;
|
||||||
|
end;
|
||||||
|
|
||||||
|
Function MakeLibName(Const aBase,aVersion : String) : string;
|
||||||
|
|
||||||
|
begin
|
||||||
|
{$IF DEFINED(WINDOWS) OR DEFINED(OS2)}
|
||||||
|
Result:=aBase+aVersion+'.dll';
|
||||||
|
{$ELSE}
|
||||||
|
{$IFNDEF DARWIN}
|
||||||
|
Result:=aBase+'.so'+aVersion;
|
||||||
|
{$ELSE}
|
||||||
|
Result:=aBase+aVersion+'.dylib';
|
||||||
|
{$ENDIF}
|
||||||
|
{$ENDIF}
|
||||||
|
end;
|
||||||
|
|
||||||
|
{$IF NOT(DEFINED(WINDOWS) OR DEFINED(OS2))}
|
||||||
|
Function LoadOpenSSl : Boolean;
|
||||||
|
|
||||||
|
var
|
||||||
|
Idx: Integer;
|
||||||
|
begin
|
||||||
|
Result:=False;
|
||||||
|
Idx := Low(DLLVersions)+StartVersionOffset;
|
||||||
|
While (not Result) and (Idx<=High(DLLVersions)) do
|
||||||
|
begin
|
||||||
|
Result := TryLoadLibPair(MakeLibName(BaseSSLName,DLLVersions[Idx]),
|
||||||
|
MakeLibName(BaseCryptoName,DLLVersions[Idx]));
|
||||||
|
Inc(Idx);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
Function LoadLibreSSl : Boolean;
|
||||||
|
|
||||||
|
var
|
||||||
|
Idx: Integer;
|
||||||
|
begin
|
||||||
|
Result:=False;
|
||||||
|
Idx := Low(LibreSSLVersions)+StartVersionOffset;
|
||||||
|
While (not Result) and (Idx<=High(LibreSSLVersions)) do
|
||||||
|
begin
|
||||||
|
Result := TryLoadLibPair(MakeLibName(BaseSSLName,LibreSSLVersions[Idx]),
|
||||||
|
MakeLibName(BaseCryptoName,LibreSSLVersions[Idx]));
|
||||||
|
Inc(Idx);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
{$ENDIF}
|
||||||
|
|
||||||
Function LoadLibraries : Boolean;
|
Function LoadLibraries : Boolean;
|
||||||
|
|
||||||
|
var
|
||||||
|
Idx: Integer;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
Result:=False;
|
Result:=False;
|
||||||
{$IFDEF DARWIN}
|
{$IF DEFINED(WINDOWS) OR DEFINED(OS2)}
|
||||||
// Mac OS no longer allows you to load the unversioned one. Bug ID 36484.
|
Assert(Low(SSL_DLL_Names) = Low(Crypto_DLL_Names));
|
||||||
DLLVERSIONS[1]:=DLLVERSIONS[2];
|
Assert(High(SSL_DLL_Names) = High(Crypto_DLL_Names));
|
||||||
|
Idx:=Low(SSL_DLL_Names);
|
||||||
|
While (not Result) and (Idx<=High(SSL_DLL_Names)) do
|
||||||
|
begin
|
||||||
|
Result := TryLoadLibPair(MakeLibName(SSL_DLL_Names[Idx],''), MakeLibName(Crypto_DLL_Names[Idx]),'');
|
||||||
|
Inc(Idx);
|
||||||
|
end;
|
||||||
|
{$ELSE}
|
||||||
|
if LibreSSLSupport=lssFirst then
|
||||||
|
Result:=LoadLibreSSL;
|
||||||
|
if not Result then
|
||||||
|
Result:=LoadOpenSSL;
|
||||||
|
if (Not Result) and (LibreSSLSupport=lssFirst) then
|
||||||
|
Result:=LoadLibreSSL;
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
SSLUtilHandle := LoadLib(DLLUtilName);
|
|
||||||
SSLLibHandle := LoadLib(DLLSSLName);
|
|
||||||
{$IFDEF MSWINDOWS}
|
|
||||||
if (SSLUtilHandle = 0) then
|
|
||||||
SSLUtilHandle := LoadLib(DLLUtilName2);
|
|
||||||
if (SSLLibHandle = 0) then
|
|
||||||
SSLLibHandle := LoadLib(DLLSSLName2);
|
|
||||||
if (SSLLibHandle = 0) then
|
|
||||||
SSLLibHandle := LoadLib(DLLSSLName3);
|
|
||||||
{$ELSE MSWINDOWS}
|
|
||||||
{$IFDEF OS2}
|
|
||||||
if (SSLUtilHandle = 0) then
|
|
||||||
SSLUtilHandle := LoadLib(DLLUtilName2);
|
|
||||||
if (SSLLibHandle = 0) then
|
|
||||||
SSLLibHandle := LoadLib(DLLSSLName2);
|
|
||||||
{$ENDIF OS2}
|
|
||||||
{$ENDIF MSWINDOWS}
|
|
||||||
Result:=(SSLLibHandle<>0) and (SSLUtilHandle<>0);
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function InitSSLInterface: Boolean;
|
function InitSSLInterface: Boolean;
|
||||||
|
Loading…
Reference in New Issue
Block a user