瀏覽代碼

* Merging revisions 42864 from trunk:
------------------------------------------------------------------------
r42864 | michael | 2019-08-28 21:28:30 +0200 (Wed, 28 Aug 2019) | 1 line

* Bring OpenSSL up to date with V1.1
------------------------------------------------------------------------

git-svn-id: branches/fixes_3_2@42865 -

michael 6 年之前
父節點
當前提交
f6681cb340
共有 2 個文件被更改,包括 246 次插入38 次删除
  1. 11 5
      packages/openssl/examples/test1.pas
  2. 235 33
      packages/openssl/src/openssl.pas

+ 11 - 5
packages/openssl/examples/test1.pas

@@ -3,12 +3,18 @@ program test1;
 {$mode objfpc}{$H+}
 
 uses
-  OpenSSL;
+  SysUtils,OpenSSL;
+
+Const
+  Bools : Array[Boolean] of string = ('Failed','OK');
+
+Var
+  B : Boolean;
 
 begin
-  if InitSSLInterface then
-    Writeln('Success')
-  else
-    Writeln('Load failed, missing functions: ',OpenSSL_unavailable_functions);
+  B:=InitSSLInterface(True);
+  Writeln('Load ',Bools[B],', missing functions: ');
+  if OpenSSL_unavailable_functions<>'' then
+    Writeln(OpenSSL_unavailable_functions);
 end.
 

+ 235 - 33
packages/openssl/src/openssl.pas

@@ -127,6 +127,7 @@ const
   SHA_DIGEST_LENGTH = 20;
 
 type
+  uint64_t = qword;
   SslPtr = Pointer;
   PSslPtr = ^SslPtr;
   PSSL_CTX = SslPtr;
@@ -141,6 +142,7 @@ type
   PRSA = SslPtr;
   PASN1_UTCTIME = SslPtr;
   PASN1_INTEGER = SSlPtr;
+  POPENSSL_INIT_SETTINGS = SSLPtr;
 
   PDH = pointer;
   PSTACK_OFX509 = pointer;
@@ -581,6 +583,36 @@ const
   SSL_ERROR_WANT_CHANNEL_ID_LOOKUP = 9;
   SSL_ERROR_PENDING_SESSION = 11;
 
+  OPENSSL_INIT_NO_LOAD_CRYPTO_STRINGS = $00000001;
+  OPENSSL_INIT_LOAD_CRYPTO_STRINGS    = $00000002;
+  OPENSSL_INIT_ADD_ALL_CIPHERS        = $00000004;
+  OPENSSL_INIT_ADD_ALL_DIGESTS        = $00000008;
+  OPENSSL_INIT_NO_ADD_ALL_CIPHERS     = $00000010;
+  OPENSSL_INIT_NO_ADD_ALL_DIGESTS     = $00000020;
+  OPENSSL_INIT_LOAD_CONFIG            = $00000040;
+  OPENSSL_INIT_NO_LOAD_CONFIG         = $00000080;
+  OPENSSL_INIT_ASYNC                  = $00000100;
+  OPENSSL_INIT_ENGINE_RDRAND          = $00000200;
+  OPENSSL_INIT_ENGINE_DYNAMIC         = $00000400;
+  OPENSSL_INIT_ENGINE_OPENSSL         = $00000800;
+  OPENSSL_INIT_ENGINE_CRYPTODEV       = $00001000;
+  OPENSSL_INIT_ENGINE_CAPI            = $00002000;
+  OPENSSL_INIT_ENGINE_PADLOCK         = $00004000;
+  OPENSSL_INIT_ENGINE_AFALG           = $00008000;
+  OPENSSL_INIT_ATFORK                 = $00020000;
+  OPENSSL_INIT_NO_LOAD_SSL_STRINGS    = $00100000;
+  OPENSSL_INIT_LOAD_SSL_STRINGS       = $00200000;
+
+  OPENSSL_INIT_SSL_DEFAULT            =  (OPENSSL_INIT_LOAD_SSL_STRINGS or OPENSSL_INIT_LOAD_CRYPTO_STRINGS);
+
+  OPENSSL_INIT_ENGINE_ALL_BUILTIN =
+      OPENSSL_INIT_ENGINE_RDRAND or
+      OPENSSL_INIT_ENGINE_DYNAMIC or
+      OPENSSL_INIT_ENGINE_CRYPTODEV or
+      OPENSSL_INIT_ENGINE_CAPI or
+      OPENSSL_INIT_ENGINE_PADLOCK;
+
+
   SSL_CTRL_NEED_TMP_RSA = 1;
   SSL_CTRL_SET_TMP_RSA = 2;
   SSL_CTRL_SET_TMP_DH = 3;
@@ -1026,6 +1058,7 @@ var
 // libssl.dll
   function OpenSSLGetVersion(t: cint):String;
   function SslGetError(s: PSSL; ret_code: cInt):cInt;
+  Function OPENSSL_init_ssl(opts: uint64_t ; settings : POPENSSL_INIT_SETTINGS) : cint;
   function SslLibraryInit:cInt;
   procedure SslLoadErrorStrings;
 //  function SslCtxSetCipherList(arg0: PSSL_CTX; str: PChar):cInt;
@@ -1086,6 +1119,11 @@ var
   function SslSetSslCtx(ssl: PSSL; ctx: PSSL_CTX): PSSL;
 
 // libeay.dll
+  function OPENSSL_INIT_new : POPENSSL_INIT_SETTINGS;
+  Procedure OPENSSL_INIT_free(aSettings : POPENSSL_INIT_SETTINGS);
+  function OPENSSL_INIT_set_config_appname (settings:POPENSSL_INIT_SETTINGS; config_file : Pchar) : cint;
+  Function OPENSSL_init_crypto ( opts: uint64_t ; settings : POPENSSL_INIT_SETTINGS) : cint;
+  Procedure OPENSSL_cleanup;
   procedure ERR_load_crypto_strings;
   function X509New: PX509;
   procedure X509Free(x: PX509);
@@ -1142,8 +1180,8 @@ var
 
   function RAND_set_rand_method(const meth: PRAND_METHOD): cint;
   function RAND_get_rand_method: PRAND_METHOD;
-  function RAND_SSLeay: PRAND_METHOD;
-  procedure RAND_cleanup;
+  function RAND_SSLeay: PRAND_METHOD; deprecated 'No longer in OpenSSL';
+  procedure RAND_cleanup; deprecated 'deprecated as of 1.1';
   function RAND_bytes(buf: PByte; num: cint): cint;
   function RAND_pseudo_bytes(buf: PByte; num: cint): cint;
   procedure RAND_seed(const buf: Pointer; num: cint);
@@ -1514,6 +1552,12 @@ type
   TOpenSSLversion = function (arg : cint) : pchar; cdecl;
   TSslGetError = function(s: PSSL; ret_code: cInt):cInt; cdecl;
   TSslLibraryInit = function:cInt; cdecl;
+  TOPENSSL_INIT_new = function : POPENSSL_INIT_SETTINGS; cdecl;
+  TOPENSSL_INIT_free = procedure(settings : POPENSSL_INIT_SETTINGS); cdecl;
+  TOPENSSL_INIT_set_config_appname = function (settings:POPENSSL_INIT_SETTINGS; config_file : Pchar) : cint;
+
+  TOPENSSL_init_ssl = function ( opts: uint64_t ; settings : POPENSSL_INIT_SETTINGS) : cint; cdecl;
+  TOPENSSL_cleanup = procedure; cdecl;
   TSslLoadErrorStrings = procedure; cdecl;
   TSslCtxSetCipherList = function(arg0: PSSL_CTX; str: PChar):cInt; cdecl;
   TSslCtxNew = function(meth: PSSL_METHOD):PSSL_CTX; cdecl;
@@ -1697,6 +1741,7 @@ type
   //
   TEVP_CIPHER_CTX_init = procedure(a: PEVP_CIPHER_CTX); cdecl;
   TEVP_CIPHER_CTX_cleanup = function(a: PEVP_CIPHER_CTX): cint; cdecl;
+  TEVP_CIPHER_CTX_reset = function(a: PEVP_CIPHER_CTX): cint; cdecl;
   TEVP_CIPHER_CTX_set_key_length = function(x: PEVP_CIPHER_CTX; keylen: cint): cint; cdecl;
   TEVP_CIPHER_CTX_ctrl = function(ctx: PEVP_CIPHER_CTX; type_, arg: cint; ptr: Pointer): cint; cdecl;
   //
@@ -1745,6 +1790,7 @@ var
   _OpenSSLVersion : TOpenSSLversion = Nil;
   _SslGetError: TSslGetError = nil;
   _SslLibraryInit: TSslLibraryInit = nil;
+  _OPENSSL_init_ssl : TOPENSSL_init_ssl = Nil;
   _SslLoadErrorStrings: TSslLoadErrorStrings = nil;
   _SslCtxSetCipherList: TSslCtxSetCipherList = nil;
   _SslCtxNew: TSslCtxNew = nil;
@@ -1791,6 +1837,11 @@ var
   _SslSetSslCtx: TSSLSetSslCtx = nil;
 
 // libeay.dll
+  _OPENSSL_cleanup : TOPENSSL_cleanup = Nil;
+  _OPENSSL_INIT_new : TOPENSSL_INIT_new = nil;
+  _OPENSSL_INIT_free : TOPENSSL_INIT_free = nil;
+  _OPENSSL_INIT_set_config_appname : TOPENSSL_INIT_set_config_appname = Nil;
+  _OPENSSL_init_crypto : TOPENSSL_init_ssl = Nil;
   _ERR_load_crypto_strings: TERR_load_crypto_strings = nil;
   _X509New: TX509New = nil;
   _X509Free: TX509Free = nil;
@@ -1940,6 +1991,7 @@ var
   _EVP_get_cipherbyname: TEVP_get_cipherbyname = nil;
   _EVP_get_digestbyname: TEVP_get_digestbyname = nil;
   //
+  _EVP_CIPHER_CTX_reset: TEVP_CIPHER_CTX_reset = nil;
   _EVP_CIPHER_CTX_init: TEVP_CIPHER_CTX_init = nil;
   _EVP_CIPHER_CTX_cleanup: TEVP_CIPHER_CTX_cleanup = nil;
   _EVP_CIPHER_CTX_set_key_length: TEVP_CIPHER_CTX_set_key_length = nil;
@@ -2107,18 +2159,31 @@ begin
     Result := SSL_ERROR_SSL;
 end;
 
+Function OPENSSL_init_ssl(opts: uint64_t ; settings : POPENSSL_INIT_SETTINGS) : cint;
+
+begin
+  Result := 1;
+  if InitSSLInterface and Assigned(_OPENSSL_init_ssl) then
+    Result:=_OPENSSL_init_ssl(opts,settings);
+end;
+
 function SslLibraryInit:cInt;
 begin
-  if InitSSLInterface and Assigned(_SslLibraryInit) then
-    Result := _SslLibraryInit
-  else
-    Result := 1;
+  Result := 1;
+  if InitSSLInterface then
+    if Assigned(_SslLibraryInit) then
+      Result := _SslLibraryInit
+    else if Assigned(_OPENSSL_init_ssl) then
+      Result:=_OPENSSL_init_ssl(0,Nil)
 end;
 
 procedure SslLoadErrorStrings;
 begin
-  if InitSSLInterface and Assigned(_SslLoadErrorStrings) then
-    _SslLoadErrorStrings;
+  if InitSSLInterface then
+    if Assigned(_SslLoadErrorStrings) then
+      _SslLoadErrorStrings
+    else if Assigned(_OpenSSl_init_ssl) then
+      _OpenSSL_init_ssl(OPENSSL_INIT_LOAD_SSL_STRINGS or OPENSSL_INIT_LOAD_CRYPTO_STRINGS,Nil)
 end;
 
 function SslCtxSetCipherList(arg0: PSSL_CTX; var str: String):cInt;
@@ -2511,10 +2576,53 @@ begin
     Result := '';
 end;
 
+Procedure OPENSSL_cleanup;
+
+begin
+  if InitSSLInterface and Assigned(_OPENSSL_cleanup) then
+    _OPENSSL_cleanup();
+end;
+
+function OPENSSL_INIT_new : POPENSSL_INIT_SETTINGS;
+
+begin
+  if InitsslInterface and assigned(_OPENSSL_INIT_new) then
+    Result:=_OPENSSL_INIT_new()
+  else
+    result:=nil;
+end;
+
+procedure OPENSSL_INIT_free(aSettings : POPENSSL_INIT_SETTINGS);
+
+begin
+  if InitsslInterface and assigned(_OPENSSL_INIT_free) then
+    _OPENSSL_INIT_free(aSettings);
+end;
+
+function OPENSSL_INIT_set_config_appname (settings:POPENSSL_INIT_SETTINGS; config_file : Pchar) : cint;
+
+begin
+  if InitsslInterface and assigned(_OPENSSL_INIT_set_config_appname) then
+    Result:=_OPENSSL_INIT_set_config_appname(Settings,config_file)
+  else
+    Result:=1;
+end;
+
+Function OPENSSL_init_crypto ( opts: uint64_t ; settings : POPENSSL_INIT_SETTINGS) : cint;
+begin
+  if InitSSLInterface and Assigned(_OPENSSL_init_crypto) then
+    Result:=_OPENSSL_init_crypto(opts,Settings)
+  else
+    Result:=1;
+end;
+
 procedure ERR_load_crypto_strings;
 Begin
-  if InitSSLInterface and Assigned(_ERR_load_crypto_strings) then
-    _ERR_load_crypto_strings;
+  if InitSSLInterface then
+    if Assigned(_ERR_load_crypto_strings) then
+     _ERR_load_crypto_strings
+    else if Assigned(_OPENSSL_init_crypto) then
+     _OPENSSL_init_crypto(OPENSSL_INIT_LOAD_CRYPTO_STRINGS,Nil);
 end;
 
 function X509New: PX509;
@@ -2951,7 +3059,7 @@ end;
 procedure RAND_cleanup;
 begin
   if InitSSLInterface and Assigned(_RAND_cleanup) then
-    _RAND_cleanup();
+    _RAND_cleanup(); // OK if it does not exit;
 end;
 
 function RAND_bytes(buf: PByte; num: cint): cint;
@@ -3395,20 +3503,30 @@ end;
 
 procedure OpenSSL_add_all_algorithms;
 begin
-  if InitSSLInterface and Assigned(_OpenSSL_add_all_algorithms) then
-    _OpenSSL_add_all_algorithms();
+  if InitSSLInterface then
+    if Assigned(_OpenSSL_add_all_algorithms) then
+      _OpenSSL_add_all_algorithms()
+    else if assigned(_OPENSSL_init_crypto) then
+       _OPENSSL_init_crypto(OPENSSL_INIT_ADD_ALL_CIPHERS or OPENSSL_INIT_ADD_ALL_DIGESTS or OPENSSL_INIT_LOAD_CONFIG, Nil)
 end;
 
 procedure OpenSSL_add_all_ciphers;
 begin
-  if InitSSLInterface and Assigned(_OpenSSL_add_all_ciphers) then
-    _OpenSSL_add_all_ciphers();
+  if InitSSLInterface then
+    if Assigned(_OpenSSL_add_all_ciphers) then
+      _OpenSSL_add_all_ciphers()
+   else if assigned(_OPENSSL_init_crypto) then
+      _OPENSSL_init_crypto(OPENSSL_INIT_ADD_ALL_CIPHERS, Nil)
 end;
 
 procedure OpenSSL_add_all_digests;
+
 begin
-  if InitSSLInterface and Assigned(_OpenSSL_add_all_digests) then
-    _OpenSSL_add_all_digests();
+  if InitSSLInterface then
+    if Assigned(_OpenSSL_add_all_digests) then
+      _OpenSSL_add_all_digests()
+    else if assigned(_OPENSSL_init_crypto) then
+     _OPENSSL_init_crypto(OPENSSL_INIT_ADD_ALL_DIGESTS, Nil)
 end;
 //
 function EVP_DigestInit(ctx: PEVP_MD_CTX; type_: PEVP_MD): cint;
@@ -3487,14 +3605,20 @@ end;
 //
 procedure EVP_CIPHER_CTX_init(a: PEVP_CIPHER_CTX);
 begin
-  if InitSSLInterface and Assigned(_EVP_CIPHER_CTX_init) then
-    _EVP_CIPHER_CTX_init(a);
+  if InitSSLInterface then
+    if Assigned(_EVP_CIPHER_CTX_init) then
+    _EVP_CIPHER_CTX_init(a)
+  else if Assigned(_EVP_CIPHER_CTX_reset) then
+    _EVP_CIPHER_CTX_reset(a);
 end;
 
 function EVP_CIPHER_CTX_cleanup(a: PEVP_CIPHER_CTX): cint;
 begin
-  if InitSSLInterface and Assigned(_EVP_CIPHER_CTX_cleanup) then
+  if InitSSLInterface then
+   if  Assigned(_EVP_CIPHER_CTX_cleanup) then
     Result := _EVP_CIPHER_CTX_cleanup(a)
+  else if  Assigned(_EVP_CIPHER_CTX_reset) then
+    Result := _EVP_CIPHER_CTX_reset(a)
   else
     Result := -1;
 end;
@@ -4450,10 +4574,12 @@ end;
 
 function BN_mod(rem: PBIGNUM; a: PBIGNUM; m: PBIGNUM; ctx: PBN_CTX): cint;
 begin
-  if InitSSLInterface and Assigned(_BN_mod) then
-    Result:=_BN_mod(rem, a, m, ctx)
-  else
-    Result:=-1;
+  Result:=-1;
+  if InitSSLInterface then
+    if Assigned(_BN_mod) then
+      Result:=_BN_mod(rem, a, m, ctx)
+    else if assigned(_BN_div) then
+      Result:=_BN_div(nil,rem, a, m, ctx)
 end;
 
 function BN_nnmod(r: PBIGNUM; m: PBIGNUM; d: PBIGNUM; ctx: PBN_CTX): cint;
@@ -4663,11 +4789,58 @@ begin
   {$ENDIF WINDOWS}
 end;
 
+Function CheckOK(ProcName : string ) : string;
+
+
+begin
+  Result:=ProcName;
+  if (ProcName='SSL_library_init')
+     or (ProcName='SSL_load_error_strings')
+     or (ProcName='ERR_load_crypto_strings')
+     or (ProcName='ERR_load_CRYPTOlib_strings')
+     or (ProcName='OpenSSL_add_all_algorithms')
+     or (ProcName='OpenSSL_add_all_ciphers')
+     or (ProcName='OpenSSL_add_all_digests')
+     or (ProcName='EVP_CIPHER_CTX_init')
+     or (ProcName='EVP_CIPHER_CTX_reset')
+     or (ProcName='EVP_CIPHER_CTX_cleanup')
+     or (ProcName='EVP_cleanup')
+     or (ProcName='OPENSSL_cleanup')
+     or (ProcName='OPENSSL_init_crypto')
+     or (ProcName='OPENSSL_INIT_new')
+     or (ProcName='OPENSSL_INIT_free')
+     or (ProcName='OPENSSL_INIT_set_config_appname')
+     or (ProcName='OPENSSL_init_ssl')
+     or (ProcName='SSLeay_version')
+     or (ProcName='ERR_free_strings')
+     or (ProcName='X509_set_notBefore')
+     or (ProcName='X509_set1_notBefore')
+     or (ProcName='X509_set_notAfter')
+     or (ProcName='X509_set1_notAfter')
+     or (ProcName='RAND_screen')
+     or (ProcName='RAND_cleanup')
+     or (ProcName='RAND_SSLeay')
+     or (ProcName='CRYPTO_num_locks')
+     or (ProcName='CRYPTO_set_locking_callback')
+     or (ProcName='BN_mod')
+     or (ProcName='OpenSSL_version') then
+      Result:=Result+' (handled in unit)';
+
+  if (ProcName='SSLv2_method')
+     or (ProcName='SSLv3_method')
+     or (ProcName='SSLv23_method')
+     or (ProcName='RAND_query_egd_bytes')
+     or (ProcName='RAND_egd')
+     or (ProcName='RAND_egd_bytes')
+     then
+    Result:=Result+' (method not supported by lib)';
+end;
+
 function GetProcAddr(module: HModule; const ProcName: string): SslPtr;
 begin
   Result := GetProcAddress(module, PChar(ProcName));
   if LoadVerbose and (Result = nil) then
-    OpenSSL_unavailable_functions := OpenSSL_unavailable_functions + ProcName + LineEnding;
+    OpenSSL_unavailable_functions := OpenSSL_unavailable_functions + CheckOK(ProcName) + LineEnding;
 end;
 
 // The AVerboseLoading parameter can be used to check which particular
@@ -4686,6 +4859,7 @@ begin
   _OpenSSLVersion := GetProcAddr(SSLLibHandle, 'OpenSSL_version');
   _SslGetError := GetProcAddr(SSLLibHandle, 'SSL_get_error');
   _SslLibraryInit := GetProcAddr(SSLLibHandle, 'SSL_library_init');
+  _OPENSSL_init_ssl := GetProcAddr(SSLLibHandle, 'OPENSSL_init_ssl');
   _SslLoadErrorStrings := GetProcAddr(SSLLibHandle, 'SSL_load_error_strings');
   _SslCtxSetCipherList := GetProcAddr(SSLLibHandle, 'SSL_CTX_set_cipher_list');
   _SslCtxNew := GetProcAddr(SSLLibHandle, 'SSL_CTX_new');
@@ -4738,6 +4912,15 @@ Procedure LoadUtilEntryPoints;
 
 begin
   _ERR_load_crypto_strings := GetProcAddr(SSLUtilHandle, 'ERR_load_crypto_strings');
+  // aliases used over time
+  if (@_ERR_load_crypto_strings=Nil) then
+    _ERR_load_crypto_strings:=GetProcAddr(SSLUtilHandle, 'ERR_load_CRYPTOlib_strings');
+  if (@_ERR_load_crypto_strings=Nil) then
+    _ERR_load_crypto_strings:=GetProcAddr(SSLUtilHandle, 'ERR_load_CRYPTO_strings');
+  _OPENSSL_init_crypto :=  GetProcAddr(SSLUtilHandle, 'OPENSSL_init_crypto');
+  _OPENSSL_INIT_new := GetProcAddr(SSLUtilHandle, 'OPENSSL_INIT_new');
+  _OPENSSL_INIT_free := GetProcAddr(SSLUtilHandle, 'OPENSSL_INIT_free');
+  _OPENSSL_INIT_set_config_appname :=GetProcAddr(SSLUtilHandle, 'OPENSSL_INIT_set_config_appname');
   _X509New := GetProcAddr(SSLUtilHandle, 'X509_new');
   _X509Free := GetProcAddr(SSLUtilHandle, 'X509_free');
   _X509NameOneline := GetProcAddr(SSLUtilHandle, 'X509_NAME_oneline');
@@ -4754,7 +4937,11 @@ begin
   _X509Sign := GetProcAddr(SSLUtilHandle, 'X509_sign');
   _X509GmtimeAdj := GetProcAddr(SSLUtilHandle, 'X509_gmtime_adj');
   _X509SetNotBefore := GetProcAddr(SSLUtilHandle, 'X509_set_notBefore');
+  if (@_X509SetNotBefore=nil) then
+    _X509SetNotBefore:=GetProcAddr(SSLUtilHandle, 'X509_set1_notBefore');
   _X509SetNotAfter := GetProcAddr(SSLUtilHandle, 'X509_set_notAfter');
+  if (@_X509SetNotAfter=nil) then
+    _X509SetNotAfter:=GetProcAddr(SSLUtilHandle, 'X509_set1_notAfter');
   _X509GetSerialNumber := GetProcAddr(SSLUtilHandle, 'X509_get_serialNumber');
   _EvpPkeyNew := GetProcAddr(SSLUtilHandle, 'EVP_PKEY_new');
   _EvpPkeyFree := GetProcAddr(SSLUtilHandle, 'EVP_PKEY_free');
@@ -4762,6 +4949,8 @@ begin
   _EVPCleanup := GetProcAddr(SSLUtilHandle, 'EVP_cleanup');
   _EvpGetDigestByName := GetProcAddr(SSLUtilHandle, 'EVP_get_digestbyname');
   _SSLeayversion := GetProcAddr(SSLUtilHandle, 'SSLeay_version');
+  if @_SSLeayversion=Nil then
+    _SSLeayversion := GetProcAddr(SSLUtilHandle, 'OpenSSL_version');
   _ErrErrorString := GetProcAddr(SSLUtilHandle, 'ERR_error_string_n');
   _ErrGetError := GetProcAddr(SSLUtilHandle, 'ERR_get_error');
   _ErrClearError := GetProcAddr(SSLUtilHandle, 'ERR_clear_error');
@@ -4811,10 +5000,10 @@ begin
   _EVP_DigestVerifyInit := GetProcAddr(SSLUtilHandle, 'EVP_DigestVerifyInit');
   _EVP_DigestVerifyFinal := GetProcAddr(SSLUtilHandle, 'EVP_DigestVerifyFinal');
    // 3DES functions
-  _DESsetoddparity := GetProcAddr(SSLUtilHandle, 'des_set_odd_parity');
-  _DESsetkeychecked := GetProcAddr(SSLUtilHandle, 'des_set_key_checked');
-  _DESsetkey := GetProcAddr(SSLUtilHandle, 'des_set_key');
-  _DESecbencrypt := GetProcAddr(SSLUtilHandle, 'des_ecb_encrypt');
+  _DESsetoddparity := GetProcAddr(SSLUtilHandle, 'DES_set_odd_parity');
+  _DESsetkeychecked := GetProcAddr(SSLUtilHandle, 'DES_set_key_checked');
+  _DESsetkey := GetProcAddr(SSLUtilHandle, 'DES_set_key');
+  _DESecbencrypt := GetProcAddr(SSLUtilHandle, 'DES_ecb_encrypt');
   //
   _CRYPTOnumlocks := GetProcAddr(SSLUtilHandle, 'CRYPTO_num_locks');
   _CRYPTOsetlockingcallback := GetProcAddr(SSLUtilHandle, 'CRYPTO_set_locking_callback');
@@ -4863,7 +5052,7 @@ begin
    // ERR Functions
   _ERR_error_string := GetProcAddr(SSLUtilHandle, 'ERR_error_string');
    // EVP Functions
-   _OpenSSL_add_all_algorithms := GetProcAddr(SSLUtilHandle, 'OpenSSL_add_all_algorithms');
+  _OpenSSL_add_all_algorithms := GetProcAddr(SSLUtilHandle, 'OpenSSL_add_all_algorithms');
   _OpenSSL_add_all_ciphers := GetProcAddr(SSLUtilHandle, 'OpenSSL_add_all_ciphers');
   _OpenSSL_add_all_digests := GetProcAddr(SSLUtilHandle, 'OpenSSL_add_all_digests');
   _EVP_DigestInit := GetProcAddr(SSLUtilHandle, 'EVP_DigestInit');
@@ -4876,6 +5065,7 @@ begin
   _EVP_get_cipherbyname := GetProcAddr(SSLUtilHandle, 'EVP_get_cipherbyname');
   _EVP_get_digestbyname := GetProcAddr(SSLUtilHandle, 'EVP_get_digestbyname');
   _EVP_CIPHER_CTX_init := GetProcAddr(SSLUtilHandle, 'EVP_CIPHER_CTX_init');
+  _EVP_CIPHER_CTX_reset := GetProcAddr(SSLUtilHandle, 'EVP_CIPHER_CTX_reset');
   _EVP_CIPHER_CTX_cleanup := GetProcAddr(SSLUtilHandle, 'EVP_CIPHER_CTX_cleanup');
   _EVP_CIPHER_CTX_set_key_length := GetProcAddr(SSLUtilHandle, 'EVP_CIPHER_CTX_set_key_length');
   _EVP_CIPHER_CTX_ctrl := GetProcAddr(SSLUtilHandle, 'EVP_CIPHER_CTX_ctrl');
@@ -5028,6 +5218,7 @@ begin
   _OpenSSLVersion := Nil;
   _SslGetError := nil;
   _SslLibraryInit := nil;
+  _OPENSSL_init_ssl:=Nil;
   _SslLoadErrorStrings := nil;
   _SslCtxSetCipherList := nil;
   _SslCtxNew := nil;
@@ -5205,6 +5396,11 @@ Procedure ClearUtilEntryPoints;
 begin
   _SSLeayversion := nil;
   _ERR_load_crypto_strings := nil;
+  _OPENSSL_init_crypto:=Nil;
+  _OPENSSL_INIT_free:=nil;
+  _OPENSSL_INIT_set_config_appname:=Nil;
+  _OPENSSL_INIT_new:=nil;
+  _OPENSSL_cleanup:=Nil;
   _X509New := nil;
   _X509Free := nil;
   _X509NameOneline := nil;
@@ -5327,6 +5523,7 @@ begin
   _EVP_get_cipherbyname := nil;
   _EVP_get_digestbyname := nil;
   //
+  _EVP_CIPHER_CTX_reset := nil;
   _EVP_CIPHER_CTX_init := nil;
   _EVP_CIPHER_CTX_cleanup := nil;
   _EVP_CIPHER_CTX_set_key_length := nil;
@@ -5384,18 +5581,23 @@ var
   n: integer;
   max: integer;
 begin
-  max:=_CRYPTOnumlocks;
+  if (@_CRYPTOnumlocks<>nil) then
+    max:=_CRYPTOnumlocks
+  else
+    max:=1; // hardcoded in header
   SetLength(Locks,Max);
   for n := 0 to max-1 do
     InitCriticalSection(Locks[n]);
-  _CRYPTOsetlockingcallback(@locking_callback);
+  if (@_CRYPTOsetlockingcallback<>Nil) then
+    _CRYPTOsetlockingcallback(@locking_callback);
 end;
 
 procedure FreeLocks;
 var
   n: integer;
 begin
-  _CRYPTOsetlockingcallback(nil);
+  if (@_CRYPTOsetlockingcallback<>Nil) then
+    _CRYPTOsetlockingcallback(nil);
   for n := 0 to Length(Locks)-1 do
     DoneCriticalSection(Locks[n]);
   SetLength(Locks,0);