Browse Source

Build 3.0.0.1

### Build 3.0.1 - 2018-05-07
- Deprecated use of OpenSSL v1.0 versions. Only allowed OpenSSL v1.1
versions
- JSON-RPC Added param "openssl" on "nodestatus" call. Will return
OpenSSL library version as described in OpenSSL_version_num (
https://www.openssl.org/docs/man1.1.0/crypto/OPENSSL_VERSION_NUMBER.html
)
PascalCoin 7 years ago
parent
commit
856a59af33
6 changed files with 74 additions and 27 deletions
  1. 4 0
      README.md
  2. 10 15
      src/config.inc
  3. 1 1
      src/core/UConst.pas
  4. 23 1
      src/core/UCrypto.pas
  5. 34 9
      src/core/UOpenSSL.pas
  6. 2 1
      src/core/URPC.pas

+ 4 - 0
README.md

@@ -34,6 +34,10 @@ Also, consider a donation at PascalCoin development account: "0-10"
 
 
 ## History:  
 ## History:  
 
 
+### Build 3.0.1 - 2018-05-07
+- Deprecated use of OpenSSL v1.0 versions. Only allowed OpenSSL v1.1 versions
+- JSON-RPC Added param "openssl" on "nodestatus" call. Will return OpenSSL library version as described in OpenSSL_version_num ( https://www.openssl.org/docs/man1.1.0/crypto/OPENSSL_VERSION_NUMBER.html )
+
 ### Build 3.0.0 - 2018-05-02
 ### Build 3.0.0 - 2018-05-02
 - Implementation of Hard fork on block 210000
 - Implementation of Hard fork on block 210000
   - PIP - 0010: 50% inflation reduction
   - PIP - 0010: 50% inflation reduction

+ 10 - 15
src/config.inc

@@ -15,8 +15,10 @@
 
 
   Choose ONLY ONE of directives:
   Choose ONLY ONE of directives:
 
 
+    CHANGES ON 2.1.10 and V3: OpenSSL must be version 1.1
+	
     OPTIONS_BY_DEFAULT:
     OPTIONS_BY_DEFAULT:
-      In Delphi = Synapse + OpenSSL v1.0
+      In Delphi = Synapse + OpenSSL v1.1
       In FPC = Synapse + OpenSSL v1.1
       In FPC = Synapse + OpenSSL v1.1
     DelphiSockets_OpenSSLv10
     DelphiSockets_OpenSSLv10
     Synapse_OpenSSLv10
     Synapse_OpenSSLv10
@@ -59,20 +61,9 @@ ERROR: You must select ONLY ONE option: PRODUCTION or TESTNET
 ERROR: You must select ONE option!
 ERROR: You must select ONE option!
 {$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}
 {$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}
 {$IFDEF OPTIONS_BY_DEFAULT}
 {$IFDEF OPTIONS_BY_DEFAULT}
-  // By default are: Delphi = Synapse + OpenSSLv10  -  FPC = Synapse + OpenSSLv11
-  {$IFDEF FPC}
-    // With Free Pascal Compiler, only Synapse + OpenSSLv1.0 for Delphi or OpenSSLv1.1 for Linux
-    {$DEFINE Synapse}
-    {$IFDEF LINUX}
-    {$UNDEF OpenSSL10}
-    {$ELSE}
-    {$DEFINE OpenSSL10}
-    {$ENDIF}
-  {$ELSE}
-    // Delphi, Synapse + OpenSSL v1.0
-    {$DEFINE Synapse}
-    {$DEFINE OpenSSL10}
-  {$ENDIF}
+  // By default are: Synapse + OpenSSLv11
+  {$DEFINE Synapse}
+  {$UNDEF OpenSSL10}
   {$IFDEF DelphiSockets_OpenSSLv10}ERROR: You selected more than 1 option{$ENDIF}
   {$IFDEF DelphiSockets_OpenSSLv10}ERROR: You selected more than 1 option{$ENDIF}
   {$IFDEF Synapse_OpenSSLv10}ERROR: You selected more than 1 option{$ENDIF}
   {$IFDEF Synapse_OpenSSLv10}ERROR: You selected more than 1 option{$ENDIF}
   {$IFDEF Synapse_OpenSSLv11}ERROR: You selected more than 1 option{$ENDIF}
   {$IFDEF Synapse_OpenSSLv11}ERROR: You selected more than 1 option{$ENDIF}
@@ -102,3 +93,7 @@ ERROR: You must select ONE option!
   {$ENDIF}
   {$ENDIF}
 {$ENDIF}
 {$ENDIF}
 
 
+{$IFDEF OpenSSL10}
+  ERROR: OpenSLL v1.0 is not longer valid, use OpenSSL v1.1 instead
+{$ENDIF}
+

+ 1 - 1
src/core/UConst.pas

@@ -150,7 +150,7 @@ Const
   CT_OpSubtype_MultiOperation_Global      = 91;
   CT_OpSubtype_MultiOperation_Global      = 91;
   CT_OpSubtype_MultiOperation_AccountInfo = 92;
   CT_OpSubtype_MultiOperation_AccountInfo = 92;
 
 
-  CT_ClientAppVersion : AnsiString = {$IFDEF PRODUCTION}'3.0.0'{$ELSE}{$IFDEF TESTNET}'TESTNET 3.3.0'{$ELSE}{$ENDIF}{$ENDIF};
+  CT_ClientAppVersion : AnsiString = {$IFDEF PRODUCTION}'3.0.1'{$ELSE}{$IFDEF TESTNET}'TESTNET 3.3.1'{$ELSE}{$ENDIF}{$ENDIF};
 
 
   CT_Discover_IPs =  'bpascal1.dynamic-dns.net;bpascal2.dynamic-dns.net;pascalcoin1.dynamic-dns.net;pascalcoin2.dynamic-dns.net;pascalcoin1.dns1.us;pascalcoin2.dns1.us;pascalcoin1.dns2.us;pascalcoin2.dns2.us';
   CT_Discover_IPs =  'bpascal1.dynamic-dns.net;bpascal2.dynamic-dns.net;pascalcoin1.dynamic-dns.net;pascalcoin2.dynamic-dns.net;pascalcoin1.dns1.us;pascalcoin2.dns1.us;pascalcoin1.dns2.us;pascalcoin2.dns2.us';
 
 

+ 23 - 1
src/core/UCrypto.pas

@@ -142,10 +142,27 @@ uses
 Var _initialized : Boolean = false;
 Var _initialized : Boolean = false;
 
 
 Procedure _DoInit;
 Procedure _DoInit;
+var err : String;
+ c : Cardinal;
 Begin
 Begin
   if Not (_initialized) then begin
   if Not (_initialized) then begin
     _initialized := true;
     _initialized := true;
-    InitSSLFunctions;
+    If Not InitSSLFunctions then begin
+      err := 'Cannot load OpenSSL library '+SSL_C_LIB;
+      TLog.NewLog(ltError,'OpenSSL',err);
+      Raise Exception.Create(err);
+    end;
+    If Not Assigned(OpenSSL_version_num) then begin
+      err := 'OpenSSL library is not v1.1 version: '+SSL_C_LIB;
+      TLog.NewLog(ltError,'OpenSSL',err);
+      Raise Exception.Create(err);
+    end;
+    c := OpenSSL_version_num;
+    if (c<$10100000) Or (c>$1010FFFF) then begin
+      err := 'OpenSSL library is not v1.1 version ('+IntToHex(c,8)+'): '+SSL_C_LIB;
+      TLog.NewLog(ltError,'OpenSSL',err);
+      Raise Exception.Create(err);
+    end;
   end;
   end;
 End;
 End;
 
 
@@ -267,14 +284,19 @@ Var BNx,BNy : PBIGNUM;
   ctx : PBN_CTX;
   ctx : PBN_CTX;
   pub_key : PEC_POINT;
   pub_key : PEC_POINT;
 begin
 begin
+  Result := False;
   BNx := BN_bin2bn(PAnsiChar(PubKey.x),length(PubKey.x),nil);
   BNx := BN_bin2bn(PAnsiChar(PubKey.x),length(PubKey.x),nil);
+  if Not Assigned(BNx) then Exit;
   try
   try
     BNy := BN_bin2bn(PAnsiChar(PubKey.y),length(PubKey.y),nil);
     BNy := BN_bin2bn(PAnsiChar(PubKey.y),length(PubKey.y),nil);
+    if Not Assigned(BNy) then Exit;
     try
     try
       ECG := EC_GROUP_new_by_curve_name(PubKey.EC_OpenSSL_NID);
       ECG := EC_GROUP_new_by_curve_name(PubKey.EC_OpenSSL_NID);
+      if Not Assigned(ECG) then Exit;
       try
       try
         pub_key := EC_POINT_new(ECG);
         pub_key := EC_POINT_new(ECG);
         try
         try
+          if Not Assigned(pub_key) then Exit;
           ctx := BN_CTX_new;
           ctx := BN_CTX_new;
           try
           try
             Result := EC_POINT_set_affine_coordinates_GFp(ECG,pub_key,BNx,BNy,ctx)=1;
             Result := EC_POINT_set_affine_coordinates_GFp(ECG,pub_key,BNx,BNy,ctx)=1;

+ 34 - 9
src/core/UOpenSSL.pas

@@ -46,21 +46,33 @@ var
   {$ENDIF}
   {$ENDIF}
   {$ENDIF}
   {$ENDIF}
 {$ELSE}
 {$ELSE}
-  {$IFDEF FPC}
-  // Windows + Lazarus uses a OpenSSL v1.0 32 or 64 bits
-    {$ifdef CPU32}
-	SSL_C_LIB : AnsiString = 'libeay32.dll';
-    {$ENDIF}
-    {$ifdef CPU64}
-	SSL_C_LIB : AnsiString = 'libeay64.dll';
+  {$IFDEF OpenSSL10}
+    {$IFDEF FPC}
+      {$ifdef CPU32}
+	  SSL_C_LIB : AnsiString = 'libeay32.dll';
+      {$ENDIF}
+      {$ifdef CPU64}
+	  SSL_C_LIB : AnsiString = 'libeay64.dll';
+      {$ENDIF}
+    {$ELSE}
+      {$IFDEF CPUX64}
+        SSL_C_LIB : AnsiString = 'libeay64.dll';
+      {$ELSE}
+        SSL_C_LIB : AnsiString = 'libeay32.dll';
+      {$ENDIF}
     {$ENDIF}
     {$ENDIF}
   {$ELSE}
   {$ELSE}
-  // Windows + Delphi only allows OpenSSL v1.0 32 bits
-  SSL_C_LIB : AnsiString = 'libeay32.dll';
+    {$ifdef CPUX64}
+      SSL_C_LIB : AnsiString = 'libcrypto-1_1-x64.dll';
+    {$ELSE}
+      SSL_C_LIB : AnsiString = 'libcrypto-1_1.dll';
+    {$ENDIF}
   {$ENDIF}
   {$ENDIF}
 {$ENDIF}
 {$ENDIF}
 
 
 var
 var
+  OpenSSL_version_num: function: TC_ULONG; cdecl = nil;
+
   ERR_get_error: function: TC_ULONG; cdecl = nil;
   ERR_get_error: function: TC_ULONG; cdecl = nil;
   ERR_error_string: function(e: TC_ULONG; _buf: PAnsiChar): PAnsiChar; cdecl = nil;
   ERR_error_string: function(e: TC_ULONG; _buf: PAnsiChar): PAnsiChar; cdecl = nil;
   ERR_clear_error: procedure; cdecl = nil;
   ERR_clear_error: procedure; cdecl = nil;
@@ -210,6 +222,7 @@ function LoadFunctionCLib(const FceName: String; const ACritical : Boolean = Tru
 function InitSSLFunctions : Boolean;
 function InitSSLFunctions : Boolean;
 function BN_num_bytes(a: PBIGNUM): TC_INT;
 function BN_num_bytes(a: PBIGNUM): TC_INT;
 procedure OpenSSL_free(ptr: Pointer);
 procedure OpenSSL_free(ptr: Pointer);
+function OpenSSLVersion : Cardinal;
 
 
 implementation
 implementation
 
 
@@ -234,6 +247,11 @@ begin
   Result := hCrypt <> 0;
   Result := hCrypt <> 0;
 end;
 end;
 
 
+function OpenSSLVersion : Cardinal;
+begin
+  if Assigned(OpenSSL_version_num) then Result := OpenSSL_version_num
+  else Result := 0;
+end;
 
 
 function LoadFunctionCLib(const FceName: String; const ACritical : Boolean = True): Pointer;
 function LoadFunctionCLib(const FceName: String; const ACritical : Boolean = True): Pointer;
 begin
 begin
@@ -262,6 +280,13 @@ Begin
     result := false;
     result := false;
     exit;
     exit;
   end else result := true;
   end else result := true;
+  if @OpenSSL_version_num=nil then begin
+    // Important note: Only OpenSSL v1.1 has function "OpenSSL_version_num"
+    @OpenSSL_version_num := LoadFunctionCLib('OpenSSL_version_num',False);
+    if Not Assigned(OpenSSL_version_num) then begin
+      Raise Exception.Create('PascalCoin needs OpenSSL v1.1, your current DLL is lower version: '+SSL_C_LIB);
+    end;
+  end;
   if @ERR_get_error = nil then begin
   if @ERR_get_error = nil then begin
     @ERR_get_error:= LoadFunctionCLib('ERR_get_error');
     @ERR_get_error:= LoadFunctionCLib('ERR_get_error');
     @ERR_clear_error:= LoadFunctionCLib('ERR_clear_error');
     @ERR_clear_error:= LoadFunctionCLib('ERR_clear_error');

+ 2 - 1
src/core/URPC.pas

@@ -21,7 +21,7 @@ interface
 
 
 Uses UThread, ULog, UConst, UNode, UAccounts, UCrypto, UBlockChain,
 Uses UThread, ULog, UConst, UNode, UAccounts, UCrypto, UBlockChain,
   UNetProtocol, UOpTransaction, UWallet, UTime, UAES, UECIES, UTxMultiOperation,
   UNetProtocol, UOpTransaction, UWallet, UTime, UAES, UECIES, UTxMultiOperation,
-  UJSONFunctions, classes, blcksock, synsock, IniFiles, Variants, math, UBaseTypes;
+  UJSONFunctions, classes, blcksock, synsock, IniFiles, Variants, math, UBaseTypes, UOpenSSL;
 
 
 Const
 Const
   CT_RPC_ErrNum_InternalError = 100;
   CT_RPC_ErrNum_InternalError = 100;
@@ -3257,6 +3257,7 @@ begin
     GetResultObject.GetAsObject('netstats').GetAsVariant('tservers').Value:=TNetData.NetData.NetStatistics.TotalServersConnections;
     GetResultObject.GetAsObject('netstats').GetAsVariant('tservers').Value:=TNetData.NetData.NetStatistics.TotalServersConnections;
     GetResultObject.GetAsObject('netstats').GetAsVariant('breceived').Value:=TNetData.NetData.NetStatistics.BytesReceived;
     GetResultObject.GetAsObject('netstats').GetAsVariant('breceived').Value:=TNetData.NetData.NetStatistics.BytesReceived;
     GetResultObject.GetAsObject('netstats').GetAsVariant('bsend').Value:=TNetData.NetData.NetStatistics.BytesSend;
     GetResultObject.GetAsObject('netstats').GetAsVariant('bsend').Value:=TNetData.NetData.NetStatistics.BytesSend;
+    GetResultObject.GetAsVariant('openssl').Value := IntToHex(OpenSSLVersion,8);
     nsaarr := TNetData.NetData.NodeServersAddresses.GetValidNodeServers(true,20);
     nsaarr := TNetData.NetData.NodeServersAddresses.GetValidNodeServers(true,20);
     for i := low(nsaarr) to High(nsaarr) do begin
     for i := low(nsaarr) to High(nsaarr) do begin
       jso := GetResultObject.GetAsArray('nodeservers').GetAsObject(i);
       jso := GetResultObject.GetAsArray('nodeservers').GetAsObject(i);