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:  
 
+### 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
 - Implementation of Hard fork on block 210000
   - PIP - 0010: 50% inflation reduction

+ 10 - 15
src/config.inc

@@ -15,8 +15,10 @@
 
   Choose ONLY ONE of directives:
 
+    CHANGES ON 2.1.10 and V3: OpenSSL must be version 1.1
+	
     OPTIONS_BY_DEFAULT:
-      In Delphi = Synapse + OpenSSL v1.0
+      In Delphi = Synapse + OpenSSL v1.1
       In FPC = Synapse + OpenSSL v1.1
     DelphiSockets_OpenSSLv10
     Synapse_OpenSSLv10
@@ -59,20 +61,9 @@ ERROR: You must select ONLY ONE option: PRODUCTION or TESTNET
 ERROR: You must select ONE option!
 {$ENDIF}{$ENDIF}{$ENDIF}{$ENDIF}
 {$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 Synapse_OpenSSLv10}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}
 
+{$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_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';
 

+ 23 - 1
src/core/UCrypto.pas

@@ -142,10 +142,27 @@ uses
 Var _initialized : Boolean = false;
 
 Procedure _DoInit;
+var err : String;
+ c : Cardinal;
 Begin
   if Not (_initialized) then begin
     _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;
 
@@ -267,14 +284,19 @@ Var BNx,BNy : PBIGNUM;
   ctx : PBN_CTX;
   pub_key : PEC_POINT;
 begin
+  Result := False;
   BNx := BN_bin2bn(PAnsiChar(PubKey.x),length(PubKey.x),nil);
+  if Not Assigned(BNx) then Exit;
   try
     BNy := BN_bin2bn(PAnsiChar(PubKey.y),length(PubKey.y),nil);
+    if Not Assigned(BNy) then Exit;
     try
       ECG := EC_GROUP_new_by_curve_name(PubKey.EC_OpenSSL_NID);
+      if Not Assigned(ECG) then Exit;
       try
         pub_key := EC_POINT_new(ECG);
         try
+          if Not Assigned(pub_key) then Exit;
           ctx := BN_CTX_new;
           try
             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}
 {$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}
   {$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}
 
 var
+  OpenSSL_version_num: 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_clear_error: procedure; cdecl = nil;
@@ -210,6 +222,7 @@ function LoadFunctionCLib(const FceName: String; const ACritical : Boolean = Tru
 function InitSSLFunctions : Boolean;
 function BN_num_bytes(a: PBIGNUM): TC_INT;
 procedure OpenSSL_free(ptr: Pointer);
+function OpenSSLVersion : Cardinal;
 
 implementation
 
@@ -234,6 +247,11 @@ begin
   Result := hCrypt <> 0;
 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;
 begin
@@ -262,6 +280,13 @@ Begin
     result := false;
     exit;
   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
     @ERR_get_error:= LoadFunctionCLib('ERR_get_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,
   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
   CT_RPC_ErrNum_InternalError = 100;
@@ -3257,6 +3257,7 @@ begin
     GetResultObject.GetAsObject('netstats').GetAsVariant('tservers').Value:=TNetData.NetData.NetStatistics.TotalServersConnections;
     GetResultObject.GetAsObject('netstats').GetAsVariant('breceived').Value:=TNetData.NetData.NetStatistics.BytesReceived;
     GetResultObject.GetAsObject('netstats').GetAsVariant('bsend').Value:=TNetData.NetData.NetStatistics.BytesSend;
+    GetResultObject.GetAsVariant('openssl').Value := IntToHex(OpenSSLVersion,8);
     nsaarr := TNetData.NetData.NodeServersAddresses.GetValidNodeServers(true,20);
     for i := low(nsaarr) to High(nsaarr) do begin
       jso := GetResultObject.GetAsArray('nodeservers').GetAsObject(i);