Browse Source

Update EPASA to work with extended checksum protection

Pascal Coin 4 years ago
parent
commit
3c37325348
5 changed files with 34 additions and 16 deletions
  1. 3 3
      CHANGELOG.md
  2. 16 3
      src/core/UEPasa.pas
  3. 2 2
      src/core/UEPasaDecoder.pas
  4. 2 1
      src/core/URPC.pas
  5. 11 7
      src/gui-classic/UFRMOperation.pas

+ 3 - 3
CHANGELOG.md

@@ -16,7 +16,7 @@
   - Updated "Operation Object" and "Multi Operation Object" return values:
     **(IF THE WALLET IS UNLOCKED Will automatically try to decrypt encoded payloads and also return E-PASA used)**
     - "senders" or "receivers" : ARRAY
-      - "account_epasa" : (String) If operation was using valid E-PASA format and can be decoded, will return E-PASA format used
+      - "account_epasa" : (String) If operation was using valid E-PASA format and can be decoded, will return E-PASA format used with extended checksum
       - "unenc_payload" : (String) If payload can be decoded returns unencoded value in readable format (no HEXASTRING)
       - "unenc_hexpayload" : (HEXASTRING) Unencoded value in hexastring
       - "payload_method" : (String) Can be "key" or "pwd"
@@ -30,12 +30,12 @@
     - "payload_encode" : "string"(default) | "hexa" | "base58"
     - "payload" : HEXASTRING with the payload data
   - "EPasa Object" params:
-    - "account_epasa" : (String) Encoded EPASA
+    - "account_epasa" : (String) Encoded EPASA with extended checksum
     - "account" : number or name 
     - "payload_method" : "none","dest","sender","aes"
     - "pwd" : (String) Provided only if "payload_method" = "aes"
     - "payload_encode" : "string"(default) | "hexa" | "base58"
-    - "account_epasa_checksum" : (String) Encoded EPASA with extended checksum
+    - "account_epasa_classic" : (String) Encoded EPASA without extended checksum
     - "payload" : HEXASTRING with the payload data
     - "payload_type" : Byte
   - Payload encoding will automatically set "payload_type" value based on encoding params in order to store E-PASA standard

+ 16 - 3
src/core/UEPasa.pas

@@ -127,7 +127,8 @@ type
       function ToString(): String; overload;
       function ToString(AOmitExtendedChecksum: Boolean): String; overload;
 
-      class function TryParse(const AEPasaText: String; out AEPasa: TEPasa) : Boolean; static;
+      class function TryParse(const AEPasaText: String; AOmitExtendedChecksumVerification : Boolean; out AEPasa: TEPasa) : Boolean; overload; static;
+      class function TryParse(const AEPasaText: String; out AEPasa: TEPasa) : Boolean; overload; static;
       class function Parse(const AEPasaText: String): TEPasa; static;
 
       class function CalculateAccountChecksum(AAccNo: UInt32): Byte; static; inline;
@@ -169,6 +170,7 @@ type
       function Parse(const AEPasaText: String): TEPasa;
       function TryParse(const AEPasaText: String; out AEPasa: TEPasa): Boolean; overload;
       function TryParse(const AEPasaText: String; out AEPasa: TEPasa; out AErrorCode: EPasaErrorCode): Boolean; overload;
+      function TryParse(const AEPasaText: String; AOmitExtendedChecksumVerification : Boolean; out AEPasa: TEPasa; out AErrorCode: EPasaErrorCode): Boolean; overload;
   end;
 
   { TEPasaComp }
@@ -467,12 +469,18 @@ end;
 
 
 class function TEPasa.TryParse(const AEPasaText: String; out AEPasa: TEPasa): Boolean;
+begin
+  Result := TryParse(AEPasaText,False,AEPasa);
+end;
+
+class function TEPasa.TryParse(const AEPasaText: String; AOmitExtendedChecksumVerification: Boolean; out AEPasa: TEPasa): Boolean;
 var
   LParser: TEPasaParser;
   LDisposables : TDisposables;
+  LEPasaErrorCode : EPasaErrorCode;
 begin
   LParser := LDisposables.AddObject( TEPasaParser.Create() ) as TEPasaParser;
-  Result := LParser.TryParse(AEPasaText, AEPasa);
+  Result := LParser.TryParse(AEPasaText,AOmitExtendedChecksumVerification,AEPasa,LEPasaErrorCode);
 end;
 
 class function TEPasa.Parse(const AEPasaText: String): TEPasa;
@@ -525,6 +533,11 @@ begin
 end;
 
 function TEPasaParser.TryParse(const AEPasaText: String; out AEPasa: TEPasa; out AErrorCode: EPasaErrorCode): Boolean;
+begin
+  Result := TryParse(AEPasaText,False,AEPasa,AErrorCode);
+end;
+
+function TEPasaParser.TryParse(const AEPasaText: String; AOmitExtendedChecksumVerification: Boolean; out AEPasa: TEPasa; out AErrorCode: EPasaErrorCode): Boolean;
 var
   LChecksumDelim, LAccountNumber, LAccountChecksum, LAccountName, LPayloadStartChar,
   LPayloadEndChar, LPayloadContent, LPayloadPasswordDelim, LPayloadPassword,
@@ -682,7 +695,7 @@ begin
   // Extended Checksum
   LActualChecksum := TEPasaComp.ComputeExtendedChecksum(AEPasa.ToString(True));
   if (LExtendedChecksumDelim <> #0) then begin
-    if (LExtendedChecksum <> LActualChecksum) then begin
+    if (LExtendedChecksum <> LActualChecksum) and (Not AOmitExtendedChecksumVerification) then begin
       AErrorCode := EPasaErrorCode.BadExtendedChecksum;
       Exit(False);
     end;

+ 2 - 2
src/core/UEPasaDecoder.pas

@@ -183,8 +183,8 @@ begin
     Exit(False);
   end else begin
     Result := True;
-    AJSONResponse.GetAsVariant('account_epasa').Value := LEPasa.ToClassicPASAString;
-    AJSONResponse.GetAsVariant('account_epasa_checksum').Value := LEPasa.ToString(False);
+    AJSONResponse.GetAsVariant('account_epasa').Value := LEPasa.ToString(False);
+    AJSONResponse.GetAsVariant('account_epasa_classic').Value := LEPasa.ToClassicPASAString;
 
     if LEPasa.PayloadType.HasTrait(ptAddressedByName) then begin
       AJSONResponse.GetAsVariant('account').Value := LEPasa.AccountName;

+ 2 - 1
src/core/URPC.pas

@@ -232,7 +232,7 @@ begin
   Result := False;
   if AAccount>=0 then begin
     if TEPasaDecoder.TryDecodeEPASA(AAccount,APayload,ANode,AWalletKeys,APasswords,LDecodeEPasaResult,LEPasa) then begin
-      jsonObject.GetAsVariant('account_epasa').Value := LEPasa.ToClassicPASAString;
+      jsonObject.GetAsVariant('account_epasa').Value := LEPasa.ToString;
       jsonObject.GetAsVariant('unenc_payload').Value := LEPasa.Payload;
       jsonObject.GetAsVariant('unenc_hexpayload').Value := LEPasa.GetRawPayloadBytes.ToHexaString;
       Result := True;
@@ -397,6 +397,7 @@ Begin
     end;
     If OPR.DestAccount>=0 then begin
       jsonObject.GetAsVariant('dest_account').Value:=OPR.DestAccount;
+      FillEPasaOrDecrypt(OPR.DestAccount,OPR.OriginalPayload,ANode,AWalletKeys,APasswords,jsonObject);
     end;
   end;
   If OPR.newKey.EC_OpenSSL_NID>0 then begin

+ 11 - 7
src/gui-classic/UFRMOperation.pas

@@ -474,8 +474,9 @@ end;
 
 
 function TFRMOperation.CaptureEPasa(const AEPasaTxt: String; out AEPasa: TEPasa): Boolean;
+var LEPasaErrorCode : EPasaErrorCode;
 begin
-  Result := TEPasa.TryParse(AEPasaTxt,AEPasa);
+  Result := TEPasa.TryParse(AEPasaTxt,True,AEPasa);
   //
   if ((FUpdating) or (Not Result)) then Exit;
   FUpdating := True;
@@ -523,8 +524,9 @@ begin
   if CaptureEPasa(eb.Text,LEPasa) then begin
     if LEPasa.IsClassicPASA then
       eb.Text := LEPasa.ToClassicPASAString()
-    else
-      eb.Text := LEPasa.ToString(True);
+    else if eb=ebDestAccount then
+      eb.Text := LEPasa.ToString(False)
+    else eb.Text := LEPasa.ToString(True);
   end else begin
     eb.Text := '';
   end;
@@ -708,14 +710,16 @@ end;
 
 procedure TFRMOperation.searchAccount(editBox: TCustomEdit);
 Var F : TFRMAccountSelect;
-  c : Cardinal;
+  LEPasa : TEPasa;
 begin
   F := TFRMAccountSelect.Create(Self);
   try
     F.Node := FNode;
     F.WalletKeys := FWalletKeys;
     F.Filters:=editBox.Tag;
-    If TAccountComp.AccountTxtNumberToAccountNumber(editBox.Text,c) then F.DefaultAccount := c;
+    if TEPasa.TryParse(editBox.Text,LEPasa) then begin
+      if LEPasa.Account.HasValue then F.DefaultAccount := LEPasa.Account.Value
+    end;
     F.AllowSelect:=True;
     If F.ShowModal=MrOk then begin
       editBox.Text := TAccountComp.AccountNumberToAccountTxtNumber(F.GetSelected);
@@ -1664,7 +1668,7 @@ begin
     LTargetEPASA := TEPasa.Empty;
 
     If (PageControlOpType.ActivePage=tsTransaction) then begin
-      if NOT TEPasa.TryParse(ebDestAccount.Text, LTargetEPASA) then begin
+      if NOT TEPasa.TryParse(ebDestAccount.Text,True, LTargetEPASA) then begin
         AErrors := 'Indeterminable target';
         Exit(False);
       end;
@@ -1815,7 +1819,7 @@ begin
     FEncodedPayload.payload_raw := LEncryptedPayloadBytes;
     Result := LValid;
     if (LValid) And (Not FUpdating) then begin
-      ebDestAccount.Text := LTargetEPASA.ToClassicPASAString;
+      ebDestAccount.Text := LTargetEPASA.ToString(False);
     end;
   end;
 end;