* LibreSSL support

git-svn-id: trunk@46987 -
This commit is contained in:
michael 2020-09-28 13:23:43 +00:00
parent a66b6cd7c7
commit ce3335affe

View File

@ -84,30 +84,27 @@ uses
{$ENDIF OS2}
DynLibs, cTypes, SysUtils;
var
{$IFDEF WINDOWS}
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';
Type
TLibreSSLSupport = (lssFirst,lssLast,lssDisabled);
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!
Always make .so/dylib first, then versions, in descending order!
Add "." .before the version, first is always just "" }
@ -115,13 +112,26 @@ var
'.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.3', '.0.9.2', '.0.9.1');
{$ENDIF OS2}
{$ENDIF WINDOWS}
LibreSSLVersions : Array[1..8] of string =
('', '.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
// EVP.h Constants
EVP_MAX_MD_SIZE = 64; //* longest known is SHA512 */
EVP_MAX_MD_SIZE = 64; //* longest known is SHA512 */
EVP_MAX_KEY_LENGTH = 32;
EVP_MAX_IV_LENGTH = 16;
EVP_MAX_BLOCK_LENGTH = 32;
@ -4753,42 +4763,6 @@ begin
_OPENSSLaddallalgorithms;
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;
@ -5197,19 +5171,6 @@ begin
_BN_free:=GetProcAddr(SSLUtilHandle,'BN_free');
end;
Function LoadUtilLibrary : Boolean;
begin
Result:=(SSLUtilHandle<>0);
if not Result then
begin
SSLUtilHandle := LoadLib(DLLUtilName);
Result:=(SSLUtilHandle<>0);
end;
end;
Procedure ClearSSLEntryPoints;
begin
@ -5368,26 +5329,6 @@ begin
_BN_free:=nil;
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;
begin
@ -5613,32 +5554,89 @@ begin
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;
var
Idx: Integer;
begin
Result:=False;
{$IFDEF DARWIN}
// Mac OS no longer allows you to load the unversioned one. Bug ID 36484.
DLLVERSIONS[1]:=DLLVERSIONS[2];
{$IF DEFINED(WINDOWS) OR DEFINED(OS2)}
Assert(Low(SSL_DLL_Names) = Low(Crypto_DLL_Names));
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}
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;
function InitSSLInterface: Boolean;