Browse Source

Improve caching behaviour for algorithms using endomorphisms

Ugochukwu Mmaduekwe 6 years ago
parent
commit
73c754f65e

+ 2 - 1
CryptoLib.Samples/Delphi.Samples/UsageSamples.dpr

@@ -72,7 +72,6 @@ uses
   ClpAbstractECMultiplier in '..\..\CryptoLib\src\Math\EC\Multiplier\ClpAbstractECMultiplier.pas',
   ClpFixedPointCombMultiplier in '..\..\CryptoLib\src\Math\EC\Multiplier\ClpFixedPointCombMultiplier.pas',
   ClpFixedPointPreCompInfo in '..\..\CryptoLib\src\Math\EC\Multiplier\ClpFixedPointPreCompInfo.pas',
-  ClpFixedPointUtilities in '..\..\CryptoLib\src\Math\EC\Multiplier\ClpFixedPointUtilities.pas',
   ClpWNafPreCompInfo in '..\..\CryptoLib\src\Math\EC\Multiplier\ClpWNafPreCompInfo.pas',
   ClpECAlgorithms in '..\..\CryptoLib\src\Math\EC\ClpECAlgorithms.pas',
   ClpLongArray in '..\..\CryptoLib\src\Math\EC\ClpLongArray.pas',
@@ -375,6 +374,8 @@ uses
   ClpIDHValidationParams in '..\..\CryptoLib\src\Interfaces\ClpIDHValidationParams.pas',
   ClpAESPRNGRandom in '..\..\CryptoLib\src\Utils\Randoms\ClpAESPRNGRandom.pas',
   ClpCryptLibObjectIdentifiers in '..\..\CryptoLib\src\Asn1\CryptLib\ClpCryptLibObjectIdentifiers.pas',
+  ClpEndoPreCompInfo in '..\..\CryptoLib\src\Math\EC\Endo\ClpEndoPreCompInfo.pas',
+  ClpIEndoPreCompInfo in '..\..\CryptoLib\src\Interfaces\ClpIEndoPreCompInfo.pas',
   UsageExamples in '..\src\UsageExamples.pas';
 
 begin

+ 2 - 1
CryptoLib.Tests/Delphi.Tests/CryptoLib.Tests.TestInsight.dpr

@@ -82,7 +82,6 @@ uses
   ClpAbstractECMultiplier in '..\..\CryptoLib\src\Math\EC\Multiplier\ClpAbstractECMultiplier.pas',
   ClpFixedPointCombMultiplier in '..\..\CryptoLib\src\Math\EC\Multiplier\ClpFixedPointCombMultiplier.pas',
   ClpFixedPointPreCompInfo in '..\..\CryptoLib\src\Math\EC\Multiplier\ClpFixedPointPreCompInfo.pas',
-  ClpFixedPointUtilities in '..\..\CryptoLib\src\Math\EC\Multiplier\ClpFixedPointUtilities.pas',
   ClpWNafPreCompInfo in '..\..\CryptoLib\src\Math\EC\Multiplier\ClpWNafPreCompInfo.pas',
   ClpECAlgorithms in '..\..\CryptoLib\src\Math\EC\ClpECAlgorithms.pas',
   ClpLongArray in '..\..\CryptoLib\src\Math\EC\ClpLongArray.pas',
@@ -385,6 +384,8 @@ uses
   ClpDHAgreement in '..\..\CryptoLib\src\Crypto\Agreement\ClpDHAgreement.pas',
   ClpAESPRNGRandom in '..\..\CryptoLib\src\Utils\Randoms\ClpAESPRNGRandom.pas',
   ClpCryptLibObjectIdentifiers in '..\..\CryptoLib\src\Asn1\CryptLib\ClpCryptLibObjectIdentifiers.pas',
+  ClpEndoPreCompInfo in '..\..\CryptoLib\src\Math\EC\Endo\ClpEndoPreCompInfo.pas',
+  ClpIEndoPreCompInfo in '..\..\CryptoLib\src\Interfaces\ClpIEndoPreCompInfo.pas',
   ClpFixedSecureRandom in '..\src\Utils\ClpFixedSecureRandom.pas',
   ClpIFixedSecureRandom in '..\src\Utils\ClpIFixedSecureRandom.pas',
   ClpIShortenedDigest in '..\src\Utils\ClpIShortenedDigest.pas',

+ 2 - 1
CryptoLib.Tests/Delphi.Tests/CryptoLib.Tests.dpr

@@ -85,7 +85,6 @@ uses
   ClpAbstractECMultiplier in '..\..\CryptoLib\src\Math\EC\Multiplier\ClpAbstractECMultiplier.pas',
   ClpFixedPointCombMultiplier in '..\..\CryptoLib\src\Math\EC\Multiplier\ClpFixedPointCombMultiplier.pas',
   ClpFixedPointPreCompInfo in '..\..\CryptoLib\src\Math\EC\Multiplier\ClpFixedPointPreCompInfo.pas',
-  ClpFixedPointUtilities in '..\..\CryptoLib\src\Math\EC\Multiplier\ClpFixedPointUtilities.pas',
   ClpWNafPreCompInfo in '..\..\CryptoLib\src\Math\EC\Multiplier\ClpWNafPreCompInfo.pas',
   ClpECAlgorithms in '..\..\CryptoLib\src\Math\EC\ClpECAlgorithms.pas',
   ClpLongArray in '..\..\CryptoLib\src\Math\EC\ClpLongArray.pas',
@@ -388,6 +387,8 @@ uses
   ClpDHAgreement in '..\..\CryptoLib\src\Crypto\Agreement\ClpDHAgreement.pas',
   ClpAESPRNGRandom in '..\..\CryptoLib\src\Utils\Randoms\ClpAESPRNGRandom.pas',
   ClpCryptLibObjectIdentifiers in '..\..\CryptoLib\src\Asn1\CryptLib\ClpCryptLibObjectIdentifiers.pas',
+  ClpEndoPreCompInfo in '..\..\CryptoLib\src\Math\EC\Endo\ClpEndoPreCompInfo.pas',
+  ClpIEndoPreCompInfo in '..\..\CryptoLib\src\Interfaces\ClpIEndoPreCompInfo.pas',
   ClpFixedSecureRandom in '..\src\Utils\ClpFixedSecureRandom.pas',
   ClpIFixedSecureRandom in '..\src\Utils\ClpIFixedSecureRandom.pas',
   ClpIShortenedDigest in '..\src\Utils\ClpIShortenedDigest.pas',

+ 47 - 0
CryptoLib/src/Interfaces/ClpIEndoPreCompInfo.pas

@@ -0,0 +1,47 @@
+{ *********************************************************************************** }
+{ *                              CryptoLib Library                                  * }
+{ *                Copyright (c) 2018 - 20XX Ugochukwu Mmaduekwe                    * }
+{ *                 Github Repository <https://github.com/Xor-el>                   * }
+
+{ *  Distributed under the MIT software license, see the accompanying file LICENSE  * }
+{ *          or visit http://www.opensource.org/licenses/mit-license.php.           * }
+
+{ *                              Acknowledgements:                                  * }
+{ *                                                                                 * }
+{ *      Thanks to Sphere 10 Software (http://www.sphere10.com/) for sponsoring     * }
+{ *                           development of this library                           * }
+
+{ * ******************************************************************************* * }
+
+(* &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& *)
+
+unit ClpIEndoPreCompInfo;
+
+{$I ..\Include\CryptoLib.inc}
+
+interface
+
+uses
+  ClpIECC,
+  ClpIPreCompInfo;
+
+type
+  IEndoPreCompInfo = interface(IPreCompInfo)
+    ['{84C79A80-8162-4079-8146-AA1D46A739ED}']
+
+    function GetECEndomorphism: IECEndomorphism;
+    procedure SetECEndomorphism(const value: IECEndomorphism);
+
+    property Endomorphism: IECEndomorphism read GetECEndomorphism
+      write SetECEndomorphism;
+
+    function GetMappedPoint: IECPoint;
+    procedure SetMappedPoint(const value: IECPoint);
+
+    property MappedPoint: IECPoint read GetMappedPoint write SetMappedPoint;
+
+  end;
+
+implementation
+
+end.

+ 478 - 71
CryptoLib/src/Math/EC/ClpECAlgorithms.pas

@@ -32,7 +32,11 @@ uses
   ClpIGlvEndomorphism,
   ClpIWNafPreCompInfo,
   ClpIPreCompInfo,
+  ClpIEndoPreCompInfo,
+  ClpEndoPreCompInfo,
   ClpIPreCompCallBack,
+  ClpFixedPointPreCompInfo,
+  ClpIFixedPointPreCompInfo,
   ClpIECC,
   ClpECCurveConstants,
   ClpIFiniteField;
@@ -100,6 +104,13 @@ type
       FminWidth: Int32;
       Fm_includeNegated: Boolean;
 
+      class function CheckExisting(const existingWNaf: IWNafPreCompInfo;
+        width, reqPreCompLen: Int32; includeNegated: Boolean): Boolean;
+        static; inline;
+
+      class function CheckTable(const table: TCryptoLibGenericArray<IECPoint>;
+        reqLen: Int32): Boolean; static; inline;
+
     public
       constructor Create(const p: IECPoint; minWidth: Int32;
         includeNegated: Boolean);
@@ -108,6 +119,39 @@ type
 
     end;
 
+  type
+    IPointMapCallback = interface(IPreCompCallback)
+      ['{00A66D4E-7D61-4A47-AE36-E8D89DEE8D9F}']
+
+    end;
+
+  type
+    TPointMapCallback = class(TInterfacedObject, IPreCompCallback,
+      IPointMapCallback)
+
+    strict private
+
+    var
+      Fm_p: IECPoint;
+      FpointMap: IECPointMap;
+      FfromWNaf: IWNafPreCompInfo;
+      FIncludeNegated: Boolean;
+
+      class function CheckExisting(const existingWNaf: IWNafPreCompInfo;
+        width, reqPreCompLen: Int32; includeNegated: Boolean): Boolean;
+        static; inline;
+
+      class function CheckTable(const table: TCryptoLibGenericArray<IECPoint>;
+        reqLen: Int32): Boolean; static; inline;
+
+    public
+      constructor Create(const p: IECPoint; const pointMap: IECPointMap;
+        const fromWNaf: IWNafPreCompInfo; includeNegated: Boolean);
+
+      function Precompute(const existing: IPreCompInfo): IPreCompInfo;
+
+    end;
+
   type
     IBasePointCallback = interface(IPreCompCallback)
       ['{5A81CB00-3CB4-474D-A2A7-E949F7E71AEC}']
@@ -129,13 +173,6 @@ type
 
     end;
 
-  class function CheckExisting(const existingWNaf: IWNafPreCompInfo;
-    width, reqPreCompLen: Int32; includeNegated: Boolean): Boolean;
-    static; inline;
-
-  class function CheckTable(const table: TCryptoLibGenericArray<IECPoint>;
-    reqLen: Int32): Boolean; static; inline;
-
   class function Trim(const a: TCryptoLibByteArray; length: Int32)
     : TCryptoLibByteArray; overload; static; inline;
 
@@ -251,14 +288,100 @@ type
       const windowSizeCutoffs: array of Int32; maxWidth: Int32): Int32;
       overload; static;
 
-    class function MapPointWithPrecomp(const p: IECPoint; minWidth: Int32;
-      includeNegated: Boolean; const pointMap: IECPointMap): IECPoint; static;
-
     class function Precompute(const p: IECPoint; minWidth: Int32;
       includeNegated: Boolean): IWNafPreCompInfo; static;
 
     class procedure ConfigureBasepoint(const p: IECPoint); static;
 
+    class function PrecomputeWithPointMap(const p: IECPoint;
+      const pointMap: IECPointMap; const fromWNaf: IWNafPreCompInfo;
+      includeNegated: Boolean): IWNafPreCompInfo;
+
+  end;
+
+type
+  TEndoUtilities = class abstract(TObject)
+
+  strict private
+  type
+    IEndoCallback = interface(IPreCompCallback)
+      ['{80C0B850-A97A-4603-A42F-A476ABAF2026}']
+
+    end;
+
+  type
+    TEndoCallback = class(TInterfacedObject, IPreCompCallback, IEndoCallback)
+
+    strict private
+    var
+      Fendomorphism: IECEndomorphism;
+      Fp: IECPoint;
+
+      class function CheckExisting(const existingEndo: IEndoPreCompInfo;
+        const endomorphism: IECEndomorphism): Boolean; static; inline;
+
+    public
+      constructor Create(const endomorphism: IECEndomorphism;
+        const p: IECPoint);
+
+      function Precompute(const existing: IPreCompInfo): IPreCompInfo;
+
+    end;
+
+  public
+
+    const
+    PRECOMP_NAME: String = 'bc_endo';
+
+  public
+    class function MapPoint(const endomorphism: IECEndomorphism;
+      const p: IECPoint): IECPoint; static;
+
+  end;
+
+type
+  TFixedPointUtilities = class sealed(TObject)
+  strict private
+
+  type
+    IFixedPointCallback = interface(IPreCompCallback)
+      ['{E6DFE8D3-A890-4568-AA4A-3D8BC6AF16E9}']
+
+    end;
+
+  type
+    TFixedPointCallback = class(TInterfacedObject, IPreCompCallback,
+      IFixedPointCallback)
+
+    strict private
+    var
+      Fm_p: IECPoint;
+
+      class function CheckExisting(const existingFP: IFixedPointPreCompInfo;
+        n: Int32): Boolean; static; inline;
+
+      class function CheckTable(const table: IECLookupTable; n: Int32): Boolean;
+        static; inline;
+
+    public
+      constructor Create(const p: IECPoint);
+
+      function Precompute(const existing: IPreCompInfo): IPreCompInfo;
+
+    end;
+
+  const
+    PRECOMP_NAME: String = 'bc_fixed_point';
+
+  public
+
+    class function GetFixedPointPreCompInfo(const preCompInfo: IPreCompInfo)
+      : IFixedPointPreCompInfo; static; inline;
+
+    class function GetCombSize(const c: IECCurve): Int32; static; inline;
+
+    class function Precompute(const p: IECPoint)
+      : IFixedPointPreCompInfo; static;
   end;
 
 type
@@ -345,9 +468,8 @@ type
     class function ImplShamirsTrickWNaf(const p: IECPoint; const k: TBigInteger;
       const Q: IECPoint; const l: TBigInteger): IECPoint; overload; static;
 
-    class function ImplShamirsTrickWNaf(const p: IECPoint; const k: TBigInteger;
-      const pointMapQ: IECPointMap; const l: TBigInteger): IECPoint;
-      overload; static;
+    class function ImplShamirsTrickWNaf(const endomorphism: IECEndomorphism;
+      const p: IECPoint; const k, l: TBigInteger): IECPoint; overload; static;
 
     class function ImplSumOfMultiplies
       (const ps: TCryptoLibGenericArray<IECPoint>;
@@ -359,8 +481,8 @@ type
       const ks: TCryptoLibGenericArray<TBigInteger>;
       const glvEndomorphism: IGlvEndomorphism): IECPoint; static;
 
-    class function ImplSumOfMultiplies
-      (const ps: TCryptoLibGenericArray<IECPoint>; const pointMap: IECPointMap;
+    class function ImplSumOfMultiplies(const endomorphism: IECEndomorphism;
+      const ps: TCryptoLibGenericArray<IECPoint>;
       const ks: TCryptoLibGenericArray<TBigInteger>): IECPoint;
       overload; static;
 
@@ -450,9 +572,8 @@ begin
   result := R;
 end;
 
-class function TECAlgorithms.ImplShamirsTrickWNaf(const p: IECPoint;
-  const k: TBigInteger; const pointMapQ: IECPointMap; const l: TBigInteger)
-  : IECPoint;
+class function TECAlgorithms.ImplShamirsTrickWNaf(const endomorphism
+  : IECEndomorphism; const p: IECPoint; const k, l: TBigInteger): IECPoint;
 var
   negK, negL: Boolean;
   minWidth, widthP, widthQ: Int32;
@@ -473,9 +594,10 @@ begin
 
   minWidth := TWNafUtilities.GetWindowSize(Max(k.BitLength, l.BitLength), 8);
 
-  Q := TWNafUtilities.MapPointWithPrecomp(p, minWidth, true, pointMapQ);
-  infoP := TWNafUtilities.GetWNafPreCompInfo(p);
-  infoQ := TWNafUtilities.GetWNafPreCompInfo(Q);
+  infoP := TWNafUtilities.Precompute(p, minWidth, true);
+  Q := TEndoUtilities.MapPoint(endomorphism, p);
+  infoQ := TWNafUtilities.PrecomputeWithPointMap(Q, endomorphism.pointMap,
+    infoP, true);
 
   widthP := Min(8, infoP.width);
   widthQ := Min(8, infoQ.width);
@@ -607,7 +729,7 @@ var
   infinity, R, point: IECPoint;
   tableP, tableQ: TCryptoLibGenericArray<IECPoint>;
 begin
-  len := Math.Max(System.length(wnafP), System.length(wnafQ));
+  len := Max(System.length(wnafP), System.length(wnafQ));
 
   Curve := preCompP[0].Curve;
   infinity := Curve.infinity;
@@ -694,8 +816,8 @@ begin
   result := R;
 end;
 
-class function TECAlgorithms.ImplSumOfMultiplies
-  (const ps: TCryptoLibGenericArray<IECPoint>; const pointMap: IECPointMap;
+class function TECAlgorithms.ImplSumOfMultiplies(const endomorphism
+  : IECEndomorphism; const ps: TCryptoLibGenericArray<IECPoint>;
   const ks: TCryptoLibGenericArray<TBigInteger>): IECPoint;
 var
   halfCount, fullCount: Int32;
@@ -706,6 +828,7 @@ var
   i, j0, j1, minWidth, widthP, widthQ: Int32;
   kj0, kj1: TBigInteger;
   p, Q: IECPoint;
+  pointMap: IECPointMap;
 begin
   halfCount := System.length(ps);
   fullCount := halfCount shl 1;
@@ -713,6 +836,8 @@ begin
   System.SetLength(infos, fullCount);
   System.SetLength(wnafs, fullCount);
 
+  pointMap := endomorphism.pointMap;
+
   for i := 0 to System.Pred(halfCount) do
   begin
     j0 := i shl 1;
@@ -727,11 +852,11 @@ begin
 
     minWidth := TWNafUtilities.GetWindowSize
       (Max(kj0.BitLength, kj1.BitLength), 8);
-    p := ps[i];
-    Q := TWNafUtilities.MapPointWithPrecomp(p, minWidth, true, pointMap);
 
-    infoP := TWNafUtilities.GetWNafPreCompInfo(p);
-    infoQ := TWNafUtilities.GetWNafPreCompInfo(Q);
+    p := ps[i];
+    infoP := TWNafUtilities.Precompute(p, minWidth, true);
+    Q := TEndoUtilities.MapPoint(endomorphism, p);
+    infoQ := TWNafUtilities.PrecomputeWithPointMap(Q, pointMap, infoP, true);
 
     widthP := Min(8, infoP.width);
     widthQ := Min(8, infoQ.width);
@@ -890,7 +1015,6 @@ var
   n: TBigInteger;
   len, i, J: Int32;
   &abs, ab: TCryptoLibGenericArray<TBigInteger>;
-  pointMap: IECPointMap;
   pqs: TCryptoLibGenericArray<IECPoint>;
   p, Q: IECPoint;
 begin
@@ -914,10 +1038,9 @@ begin
     System.Inc(i);
   end;
 
-  pointMap := glvEndomorphism.pointMap;
   if (glvEndomorphism.HasEfficientPointMap) then
   begin
-    result := TECAlgorithms.ImplSumOfMultiplies(ps, pointMap, Abs);
+    result := TECAlgorithms.ImplSumOfMultiplies(glvEndomorphism, ps, Abs);
     Exit;
   end;
 
@@ -929,7 +1052,7 @@ begin
   while (i < len) do
   begin
     p := ps[i];
-    Q := pointMap.Map(p);
+    Q := TEndoUtilities.MapPoint(glvEndomorphism, p);
 
     pqs[J] := p;
     System.Inc(J);
@@ -1191,12 +1314,6 @@ begin
   result := System.Copy(a, 0, length);
 end;
 
-class function TWNafUtilities.CheckTable(const table
-  : TCryptoLibGenericArray<IECPoint>; reqLen: Int32): Boolean;
-begin
-  result := (table <> Nil) and (System.length(table) >= reqLen);
-end;
-
 class procedure TWNafUtilities.Boot;
 begin
   FEMPTY_BYTES := Nil;
@@ -1270,18 +1387,6 @@ begin
     as IBasePointCallback);
 end;
 
-class function TWNafUtilities.CheckExisting(const existingWNaf
-  : IWNafPreCompInfo; width, reqPreCompLen: Int32;
-  includeNegated: Boolean): Boolean;
-begin
-  result := (existingWNaf <> Nil) and
-    (existingWNaf.width >= Max(existingWNaf.ConfWidth, width))
-
-    and CheckTable(existingWNaf.PreComp, reqPreCompLen) and
-    ((not includeNegated) or CheckTable(existingWNaf.PreCompNeg,
-    reqPreCompLen));
-end;
-
 class function TWNafUtilities.GenerateCompactNaf(const k: TBigInteger)
   : TCryptoLibInt32Array;
 var
@@ -1666,27 +1771,6 @@ begin
   result := GetWNafPreCompInfo(preCompInfo);
 end;
 
-class function TWNafUtilities.MapPointWithPrecomp(const p: IECPoint;
-  minWidth: Int32; includeNegated: Boolean; const pointMap: IECPointMap)
-  : IECPoint;
-var
-  c: IECCurve;
-  infoP: IWNafPreCompInfo;
-  Q: IECPoint;
-begin
-  c := p.Curve;
-
-  infoP := Precompute(p, minWidth, includeNegated);
-
-  Q := pointMap.Map(p);
-
-  c.Precompute(Q, PRECOMP_NAME, TMapPointCallback.Create(infoP, includeNegated,
-    pointMap) as IMapPointCallback);
-
-  result := Q;
-
-end;
-
 class function TWNafUtilities.Precompute(const p: IECPoint; minWidth: Int32;
   includeNegated: Boolean): IWNafPreCompInfo;
 begin
@@ -1695,6 +1779,17 @@ begin
     as IWNafPreCompInfo;
 end;
 
+class function TWNafUtilities.PrecomputeWithPointMap(const p: IECPoint;
+  const pointMap: IECPointMap; const fromWNaf: IWNafPreCompInfo;
+  includeNegated: Boolean): IWNafPreCompInfo;
+var
+  c: IECCurve;
+begin
+  c := p.Curve;
+  result := c.Precompute(p, PRECOMP_NAME, TPointMapCallback.Create(p, pointMap,
+    fromWNaf, includeNegated) as IPointMapCallback) as IWNafPreCompInfo;
+end;
+
 { TWNafUtilities.TMapPointCallback }
 
 constructor TWNafUtilities.TMapPointCallback.Create(const wnafPreCompP
@@ -1754,6 +1849,24 @@ end;
 
 { TWNafUtilities.TWNafCallback }
 
+class function TWNafUtilities.TWNafCallback.CheckTable
+  (const table: TCryptoLibGenericArray<IECPoint>; reqLen: Int32): Boolean;
+begin
+  result := (table <> Nil) and (System.length(table) >= reqLen);
+end;
+
+class function TWNafUtilities.TWNafCallback.CheckExisting(const existingWNaf
+  : IWNafPreCompInfo; width, reqPreCompLen: Int32;
+  includeNegated: Boolean): Boolean;
+begin
+  result := (existingWNaf <> Nil) and
+    (existingWNaf.width >= Max(existingWNaf.ConfWidth, width))
+
+    and CheckTable(existingWNaf.PreComp, reqPreCompLen) and
+    ((not includeNegated) or CheckTable(existingWNaf.PreCompNeg,
+    reqPreCompLen));
+end;
+
 constructor TWNafUtilities.TWNafCallback.Create(const p: IECPoint;
   minWidth: Int32; includeNegated: Boolean);
 begin
@@ -1972,4 +2085,298 @@ begin
   result := tempResult;
 end;
 
+{ TWNafUtilities.TPointMapCallback }
+
+class function TWNafUtilities.TPointMapCallback.CheckTable
+  (const table: TCryptoLibGenericArray<IECPoint>; reqLen: Int32): Boolean;
+begin
+  result := ((table <> Nil) and (System.length(table) >= reqLen));
+end;
+
+class function TWNafUtilities.TPointMapCallback.CheckExisting(const existingWNaf
+  : IWNafPreCompInfo; width, reqPreCompLen: Int32;
+  includeNegated: Boolean): Boolean;
+begin
+  result := ((existingWNaf <> Nil) and (existingWNaf.width >= width) and
+    (CheckTable(existingWNaf.PreComp, reqPreCompLen)) and
+    ((not includeNegated) or (CheckTable(existingWNaf.PreCompNeg,
+    reqPreCompLen))));
+end;
+
+constructor TWNafUtilities.TPointMapCallback.Create(const p: IECPoint;
+  const pointMap: IECPointMap; const fromWNaf: IWNafPreCompInfo;
+  includeNegated: Boolean);
+begin
+  Inherited Create();
+  Fm_p := p;
+  FpointMap := pointMap;
+  FfromWNaf := fromWNaf;
+  FIncludeNegated := includeNegated;
+end;
+
+function TWNafUtilities.TPointMapCallback.Precompute(const existing
+  : IPreCompInfo): IPreCompInfo;
+var
+  existingWNaf: IWNafPreCompInfo;
+  width, reqPreCompLen, i: Int32;
+  tempResult: IWNafPreCompInfo;
+  twiceFrom, Ltwice: IECPoint;
+  LpreCompFrom, LpreComp, LpreCompNeg: TCryptoLibGenericArray<IECPoint>;
+begin
+  if Supports(existing, IWNafPreCompInfo) then
+  begin
+    existingWNaf := existing as IWNafPreCompInfo;
+  end
+  else
+  begin
+    existingWNaf := Nil;
+  end;
+  width := FfromWNaf.width;
+  reqPreCompLen := System.length(FfromWNaf.PreComp);
+
+  if (CheckExisting(existingWNaf, width, reqPreCompLen, FIncludeNegated)) then
+  begin
+    result := existingWNaf;
+    Exit;
+  end;
+
+  (*
+    * TODO Ideally this method would support incremental calculation, but given the
+    * existing use-cases it would be of little-to-no benefit.
+  *)
+  tempResult := TWNafPreCompInfo.Create() as IWNafPreCompInfo;
+
+  twiceFrom := FfromWNaf.Twice;
+  if (twiceFrom <> Nil) then
+  begin
+    Ltwice := FpointMap.Map(twiceFrom);
+    tempResult.Twice := Ltwice;
+  end;
+
+  LpreCompFrom := FfromWNaf.PreComp;
+  System.SetLength(LpreComp, System.length(LpreCompFrom));
+
+  for i := 0 to System.Pred(System.length(LpreCompFrom)) do
+  begin
+    LpreComp[i] := FpointMap.Map(LpreCompFrom[i]);
+  end;
+  tempResult.PreComp := LpreComp;
+  tempResult.width := width;
+
+  if (FIncludeNegated) then
+  begin
+    System.SetLength(LpreCompNeg, System.length(LpreComp));
+
+    for i := 0 to System.Pred(System.length(LpreCompNeg)) do
+    begin
+      LpreCompNeg[i] := LpreComp[i].Negate();
+    end;
+    tempResult.PreCompNeg := LpreCompNeg;
+  end;
+
+  result := tempResult;
+end;
+
+{ TEndoUtilities }
+
+class function TEndoUtilities.MapPoint(const endomorphism: IECEndomorphism;
+  const p: IECPoint): IECPoint;
+var
+  c: IECCurve;
+  PreComp: IEndoPreCompInfo;
+begin
+  c := p.Curve;
+  PreComp := c.Precompute(p, PRECOMP_NAME, TEndoCallback.Create(endomorphism, p)
+    as IEndoCallback) as IEndoPreCompInfo;
+
+  result := PreComp.MappedPoint;
+end;
+
+{ TEndoUtilities.TEndoCallback }
+
+class function TEndoUtilities.TEndoCallback.CheckExisting(const existingEndo
+  : IEndoPreCompInfo; const endomorphism: IECEndomorphism): Boolean;
+begin
+  result := ((existingEndo <> Nil) and
+    (existingEndo.endomorphism = endomorphism) and
+    (existingEndo.MappedPoint <> Nil));
+end;
+
+constructor TEndoUtilities.TEndoCallback.Create(const endomorphism
+  : IECEndomorphism; const p: IECPoint);
+begin
+  Inherited Create();
+  Fendomorphism := endomorphism;
+  Fp := p;
+end;
+
+function TEndoUtilities.TEndoCallback.Precompute(const existing: IPreCompInfo)
+  : IPreCompInfo;
+var
+  existingEndo: IEndoPreCompInfo;
+  MappedPoint: IECPoint;
+  tempResult: IEndoPreCompInfo;
+begin
+
+  if Supports(existing, IEndoPreCompInfo) then
+  begin
+    existingEndo := existing as IEndoPreCompInfo;
+  end
+  else
+  begin
+    existingEndo := Nil;
+  end;
+
+  if (CheckExisting(existingEndo, Fendomorphism)) then
+  begin
+    result := existingEndo;
+    Exit;
+  end;
+
+  MappedPoint := Fendomorphism.pointMap.Map(Fp);
+
+  tempResult := TEndoPreCompInfo.Create() as IEndoPreCompInfo;
+  tempResult.endomorphism := Fendomorphism;
+  tempResult.MappedPoint := MappedPoint;
+  result := tempResult as IPreCompInfo;
+end;
+
+{ TFixedPointUtilities }
+
+class function TFixedPointUtilities.TFixedPointCallback.CheckTable
+  (const table: IECLookupTable; n: Int32): Boolean;
+begin
+  result := (table <> Nil) and (table.Size >= n);
+end;
+
+class function TFixedPointUtilities.TFixedPointCallback.CheckExisting
+  (const existingFP: IFixedPointPreCompInfo; n: Int32): Boolean;
+begin
+  result := (existingFP <> Nil) and CheckTable(existingFP.LookUpTable, n);
+end;
+
+class function TFixedPointUtilities.GetCombSize(const c: IECCurve): Int32;
+var
+  Order: TBigInteger;
+begin
+  Order := c.Order;
+  if (not(Order.IsInitialized)) then
+  begin
+    result := c.FieldSize + 1;
+  end
+  else
+  begin
+    result := Order.BitLength;
+  end;
+end;
+
+class function TFixedPointUtilities.GetFixedPointPreCompInfo(const preCompInfo
+  : IPreCompInfo): IFixedPointPreCompInfo;
+begin
+  result := preCompInfo as IFixedPointPreCompInfo;
+end;
+
+class function TFixedPointUtilities.Precompute(const p: IECPoint)
+  : IFixedPointPreCompInfo;
+var
+  c: IECCurve;
+begin
+  c := p.Curve;
+
+  result := c.Precompute(p, PRECOMP_NAME, TFixedPointCallback.Create(p)
+    as IFixedPointCallback) as IFixedPointPreCompInfo;
+end;
+
+{ TFixedPointUtilities.TFixedPointCallback }
+
+constructor TFixedPointUtilities.TFixedPointCallback.Create(const p: IECPoint);
+begin
+  Inherited Create();
+  Fm_p := p;
+end;
+
+function TFixedPointUtilities.TFixedPointCallback.Precompute(const existing
+  : IPreCompInfo): IPreCompInfo;
+var
+  bit, bits, minWidth, n, d, i, step: Int32;
+  existingFP: IFixedPointPreCompInfo;
+  pow2Table, LookUpTable: TCryptoLibGenericArray<IECPoint>;
+  pow2: IECPoint;
+  c: IECCurve;
+  tempResult: IFixedPointPreCompInfo;
+begin
+  if Supports(existing, IFixedPointPreCompInfo) then
+  begin
+    existingFP := existing as IFixedPointPreCompInfo;
+  end
+  else
+  begin
+    existingFP := Nil;
+  end;
+
+  c := Fm_p.Curve;
+  bits := TFixedPointUtilities.GetCombSize(c);
+  if bits > 250 then
+  begin
+    minWidth := 6
+  end
+  else
+  begin
+    minWidth := 5
+  end;
+  n := 1 shl minWidth;
+
+  if (CheckExisting(existingFP, n)) then
+  begin
+    result := existingFP;
+    Exit;
+  end;
+
+  d := (bits + minWidth - 1) div minWidth;
+
+  System.SetLength(pow2Table, minWidth + 1);
+
+  pow2Table[0] := Fm_p;
+  for i := 1 to System.Pred(minWidth) do
+  begin
+    pow2Table[i] := pow2Table[i - 1].TimesPow2(d);
+  end;
+
+  // This will be the 'offset' value
+  pow2Table[minWidth] := pow2Table[0].Subtract(pow2Table[1]);
+
+  c.NormalizeAll(pow2Table);
+
+  System.SetLength(LookUpTable, n);
+  LookUpTable[0] := pow2Table[0];
+
+  bit := minWidth - 1;
+  while bit >= 0 do
+  begin
+    pow2 := pow2Table[bit];
+
+    step := 1 shl bit;
+
+    i := step;
+
+    while i < n do
+    begin
+      LookUpTable[i] := LookUpTable[i - step].Add(pow2);
+
+      System.Inc(i, step shl 1);
+    end;
+
+    System.Dec(bit);
+  end;
+
+  c.NormalizeAll(LookUpTable);
+
+  tempResult := TFixedPointPreCompInfo.Create();
+  tempResult.LookUpTable := c.CreateCacheSafeLookupTable(LookUpTable, 0,
+    System.length(LookUpTable));
+  tempResult.offset := pow2Table[minWidth];
+  tempResult.width := minWidth;
+  result := tempResult;
+end;
+
 end.

+ 75 - 0
CryptoLib/src/Math/EC/Endo/ClpEndoPreCompInfo.pas

@@ -0,0 +1,75 @@
+{ *********************************************************************************** }
+{ *                              CryptoLib Library                                  * }
+{ *                Copyright (c) 2018 - 20XX Ugochukwu Mmaduekwe                    * }
+{ *                 Github Repository <https://github.com/Xor-el>                   * }
+
+{ *  Distributed under the MIT software license, see the accompanying file LICENSE  * }
+{ *          or visit http://www.opensource.org/licenses/mit-license.php.           * }
+
+{ *                              Acknowledgements:                                  * }
+{ *                                                                                 * }
+{ *      Thanks to Sphere 10 Software (http://www.sphere10.com/) for sponsoring     * }
+{ *                           development of this library                           * }
+
+{ * ******************************************************************************* * }
+
+(* &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& *)
+
+unit ClpEndoPreCompInfo;
+
+{$I ..\..\..\Include\CryptoLib.inc}
+
+interface
+
+uses
+  ClpIECC,
+  ClpIPreCompInfo,
+  ClpIEndoPreCompInfo;
+
+type
+  TEndoPreCompInfo = class sealed(TInterfacedObject, IPreCompInfo,
+    IEndoPreCompInfo)
+
+  strict private
+  var
+    FEndomorphism: IECEndomorphism;
+    FMappedPoint: IECPoint;
+
+    function GetECEndomorphism: IECEndomorphism; inline;
+    procedure SetECEndomorphism(const value: IECEndomorphism); inline;
+
+    function GetMappedPoint: IECPoint; inline;
+    procedure SetMappedPoint(const value: IECPoint); inline;
+
+  public
+
+    property Endomorphism: IECEndomorphism read GetECEndomorphism
+      write SetECEndomorphism;
+    property MappedPoint: IECPoint read GetMappedPoint write SetMappedPoint;
+  end;
+
+implementation
+
+{ TEndoPreCompInfo }
+
+function TEndoPreCompInfo.GetECEndomorphism: IECEndomorphism;
+begin
+  result := FEndomorphism;
+end;
+
+function TEndoPreCompInfo.GetMappedPoint: IECPoint;
+begin
+  result := FMappedPoint;
+end;
+
+procedure TEndoPreCompInfo.SetECEndomorphism(const value: IECEndomorphism);
+begin
+  FEndomorphism := value;
+end;
+
+procedure TEndoPreCompInfo.SetMappedPoint(const value: IECPoint);
+begin
+  FMappedPoint := value;
+end;
+
+end.

+ 5 - 4
CryptoLib/src/Math/EC/Endo/ClpGlvTypeBEndomorphism.pas

@@ -106,11 +106,12 @@ var
   b1, b2, a, b: TBigInteger;
   p: IGlvTypeBParameters;
 begin
-  bits := FParameters.bits;
-  b1 := CalculateB(k, FParameters.G1, bits);
-  b2 := CalculateB(k, FParameters.G2, bits);
-
   p := FParameters;
+
+  bits := p.bits;
+  b1 := CalculateB(k, p.G1, bits);
+  b2 := CalculateB(k, p.G2, bits);
+
   a := k.subtract((b1.Multiply(p.V1A)).Add(b2.Multiply(p.V2A)));
   b := (b1.Multiply(p.V1B)).Add(b2.Multiply(p.V2B)).Negate();
 

+ 1 - 1
CryptoLib/src/Math/EC/Multiplier/ClpFixedPointCombMultiplier.pas

@@ -27,7 +27,7 @@ uses
   ClpNat,
   ClpCryptoLibTypes,
   ClpIECC,
-  ClpFixedPointUtilities,
+  ClpECAlgorithms,
   ClpIFixedPointPreCompInfo,
   ClpAbstractECMultiplier,
   ClpIFixedPointCombMultiplier;

+ 0 - 219
CryptoLib/src/Math/EC/Multiplier/ClpFixedPointUtilities.pas

@@ -1,219 +0,0 @@
-{ *********************************************************************************** }
-{ *                              CryptoLib Library                                  * }
-{ *                Copyright (c) 2018 - 20XX Ugochukwu Mmaduekwe                    * }
-{ *                 Github Repository <https://github.com/Xor-el>                   * }
-
-{ *  Distributed under the MIT software license, see the accompanying file LICENSE  * }
-{ *          or visit http://www.opensource.org/licenses/mit-license.php.           * }
-
-{ *                              Acknowledgements:                                  * }
-{ *                                                                                 * }
-{ *      Thanks to Sphere 10 Software (http://www.sphere10.com/) for sponsoring     * }
-{ *                           development of this library                           * }
-
-{ * ******************************************************************************* * }
-
-(* &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& *)
-
-unit ClpFixedPointUtilities;
-
-{$I ..\..\..\Include\CryptoLib.inc}
-
-interface
-
-uses
-  SysUtils,
-  ClpBigInteger,
-  ClpCryptoLibTypes,
-  ClpIPreCompInfo,
-  ClpIPreCompCallback,
-  ClpFixedPointPreCompInfo,
-  ClpIFixedPointPreCompInfo,
-  ClpIECC;
-
-type
-  TFixedPointUtilities = class sealed(TObject)
-  strict private
-
-  type
-    IFixedPointCallback = interface(IPreCompCallback)
-      ['{E6DFE8D3-A890-4568-AA4A-3D8BC6AF16E9}']
-
-    end;
-
-  type
-    TFixedPointCallback = class(TInterfacedObject, IPreCompCallback,
-      IFixedPointCallback)
-
-    strict private
-    var
-      Fm_p: IECPoint;
-
-    public
-      constructor Create(const p: IECPoint);
-
-      function Precompute(const existing: IPreCompInfo): IPreCompInfo;
-
-    end;
-
-  const
-    PRECOMP_NAME: String = 'bc_fixed_point';
-
-    class function CheckExisting(const existingFP: IFixedPointPreCompInfo;
-      n: Int32): Boolean; static; inline;
-
-    class function CheckTable(const table: IECLookupTable; n: Int32): Boolean;
-      static; inline;
-
-  public
-
-    class function GetFixedPointPreCompInfo(const preCompInfo: IPreCompInfo)
-      : IFixedPointPreCompInfo; static; inline;
-
-    class function GetCombSize(const c: IECCurve): Int32; static; inline;
-
-    class function Precompute(const p: IECPoint)
-      : IFixedPointPreCompInfo; static;
-  end;
-
-implementation
-
-{ TFixedPointUtilities }
-
-class function TFixedPointUtilities.CheckTable(const table: IECLookupTable;
-  n: Int32): Boolean;
-begin
-  result := (table <> Nil) and (table.Size >= n);
-end;
-
-class function TFixedPointUtilities.CheckExisting(const existingFP
-  : IFixedPointPreCompInfo; n: Int32): Boolean;
-begin
-  result := (existingFP <> Nil) and CheckTable(existingFP.LookUpTable, n);
-end;
-
-class function TFixedPointUtilities.GetCombSize(const c: IECCurve): Int32;
-var
-  order: TBigInteger;
-begin
-  order := c.order;
-  if (not(order.IsInitialized)) then
-  begin
-    result := c.FieldSize + 1;
-  end
-  else
-  begin
-    result := order.BitLength;
-  end;
-end;
-
-class function TFixedPointUtilities.GetFixedPointPreCompInfo(const preCompInfo
-  : IPreCompInfo): IFixedPointPreCompInfo;
-begin
-  result := preCompInfo as IFixedPointPreCompInfo;
-end;
-
-class function TFixedPointUtilities.Precompute(const p: IECPoint)
-  : IFixedPointPreCompInfo;
-var
-  c: IECCurve;
-begin
-  c := p.Curve;
-
-  result := c.Precompute(p, PRECOMP_NAME, TFixedPointCallback.Create(p)
-    as IFixedPointCallback) as IFixedPointPreCompInfo;
-end;
-
-{ TFixedPointUtilities.TFixedPointCallback }
-
-constructor TFixedPointUtilities.TFixedPointCallback.Create(const p: IECPoint);
-begin
-  Inherited Create();
-  Fm_p := p;
-end;
-
-function TFixedPointUtilities.TFixedPointCallback.Precompute(const existing
-  : IPreCompInfo): IPreCompInfo;
-var
-  bit, bits, minWidth, n, d, i, step: Int32;
-  existingFP: IFixedPointPreCompInfo;
-  pow2Table, LookUpTable: TCryptoLibGenericArray<IECPoint>;
-  pow2: IECPoint;
-  c: IECCurve;
-  tempResult: IFixedPointPreCompInfo;
-begin
-  if Supports(existing, IFixedPointPreCompInfo) then
-  begin
-    existingFP := existing as IFixedPointPreCompInfo;
-  end
-  else
-  begin
-    existingFP := Nil;
-  end;
-
-  c := Fm_p.Curve;
-  bits := TFixedPointUtilities.GetCombSize(c);
-  if bits > 250 then
-  begin
-    minWidth := 6
-  end
-  else
-  begin
-    minWidth := 5
-  end;
-  n := 1 shl minWidth;
-
-  if (CheckExisting(existingFP, n)) then
-  begin
-    result := existingFP;
-    Exit;
-  end;
-
-  d := (bits + minWidth - 1) div minWidth;
-
-  System.SetLength(pow2Table, minWidth + 1);
-
-  pow2Table[0] := Fm_p;
-  for i := 1 to System.Pred(minWidth) do
-  begin
-    pow2Table[i] := pow2Table[i - 1].TimesPow2(d);
-  end;
-
-  // This will be the 'offset' value
-  pow2Table[minWidth] := pow2Table[0].Subtract(pow2Table[1]);
-
-  c.NormalizeAll(pow2Table);
-
-  System.SetLength(LookUpTable, n);
-  LookUpTable[0] := pow2Table[0];
-
-  bit := minWidth - 1;
-  while bit >= 0 do
-  begin
-    pow2 := pow2Table[bit];
-
-    step := 1 shl bit;
-
-    i := step;
-
-    while i < n do
-    begin
-      LookUpTable[i] := LookUpTable[i - step].Add(pow2);
-
-      System.Inc(i, step shl 1);
-    end;
-
-    System.Dec(bit);
-  end;
-
-  c.NormalizeAll(LookUpTable);
-
-  tempResult := TFixedPointPreCompInfo.Create();
-  tempResult.LookUpTable := c.CreateCacheSafeLookupTable(LookUpTable, 0,
-    System.length(LookUpTable));
-  tempResult.Offset := pow2Table[minWidth];
-  tempResult.Width := minWidth;
-  result := tempResult;
-end;
-
-end.

+ 5 - 5
CryptoLib/src/Math/EC/Multiplier/ClpGlvMultiplier.pas

@@ -65,7 +65,6 @@ begin
     raise EArgumentCryptoLibException.CreateRes(@SCurveUnknownGroupOrder);
   end;
 
-  // Fcurve := curve;
   TSetWeakRef.SetWeakReference(@Fcurve, curve);
   FglvEndomorphism := glvEndomorphism;
 end;
@@ -81,7 +80,7 @@ function TGlvMultiplier.MultiplyPositive(const p: IECPoint;
 var
   n, a, b: TBigInteger;
   ab: TCryptoLibGenericArray<TBigInteger>;
-  pointMap: IECPointMap;
+  q: IECPoint;
 begin
   if (not(Fcurve.Equals(p.curve))) then
   begin
@@ -93,14 +92,15 @@ begin
   a := ab[0];
   b := ab[1];
 
-  pointMap := FglvEndomorphism.pointMap;
   if (FglvEndomorphism.HasEfficientPointMap) then
   begin
-    Result := TECAlgorithms.ImplShamirsTrickWNaf(p, a, pointMap, b);
+    Result := TECAlgorithms.ImplShamirsTrickWNaf(FglvEndomorphism, p, a, b);
     Exit;
   end;
 
-  Result := TECAlgorithms.ImplShamirsTrickWNaf(p, a, pointMap.Map(p), b);
+  q := TEndoUtilities.MapPoint(FglvEndomorphism, p);
+
+  Result := TECAlgorithms.ImplShamirsTrickWNaf(p, a, q, b);
 end;
 
 end.

+ 3 - 2
CryptoLib/src/Packages/Delphi/CryptoLib4PascalPackage.dpk

@@ -316,7 +316,6 @@ contains
   ClpBigIntegers in '..\..\Utils\ClpBigIntegers.pas',
   ClpFixedPointCombMultiplier in '..\..\Math\EC\Multiplier\ClpFixedPointCombMultiplier.pas',
   ClpFixedPointPreCompInfo in '..\..\Math\EC\Multiplier\ClpFixedPointPreCompInfo.pas',
-  ClpFixedPointUtilities in '..\..\Math\EC\Multiplier\ClpFixedPointUtilities.pas',
   ClpGlvTypeBEndomorphism in '..\..\Math\EC\Endo\ClpGlvTypeBEndomorphism.pas',
   ClpGlvTypeBParameters in '..\..\Math\EC\Endo\ClpGlvTypeBParameters.pas',
   ClpIDsa in '..\..\Interfaces\ClpIDsa.pas',
@@ -403,6 +402,8 @@ contains
   ClpIDHDomainParameters in '..\..\Interfaces\ClpIDHDomainParameters.pas',
   ClpIDHValidationParams in '..\..\Interfaces\ClpIDHValidationParams.pas',
   ClpAESPRNGRandom in '..\..\Utils\Randoms\ClpAESPRNGRandom.pas',
-  ClpCryptLibObjectIdentifiers in '..\..\Asn1\CryptLib\ClpCryptLibObjectIdentifiers.pas';
+  ClpCryptLibObjectIdentifiers in '..\..\Asn1\CryptLib\ClpCryptLibObjectIdentifiers.pas',
+  ClpEndoPreCompInfo in '..\..\Math\EC\Endo\ClpEndoPreCompInfo.pas',
+  ClpIEndoPreCompInfo in '..\..\Interfaces\ClpIEndoPreCompInfo.pas';
 
 end.

+ 565 - 561
CryptoLib/src/Packages/FPC/CryptoLib4PascalPackage.lpk

@@ -25,7 +25,7 @@
  Acknowledgements: 
 Thanks to Sphere 10 Software (http://www.sphere10.com/) for sponsoring the development of this library "/>
     <Version Major="3" Minor="1"/>
-    <Files Count="371">
+    <Files Count="372">
       <Item1>
         <Filename Value="..\..\Asn1\ClpOidTokenizer.pas"/>
         <UnitName Value="ClpOidTokenizer"/>
@@ -391,1127 +391,1131 @@ Thanks to Sphere 10 Software (http://www.sphere10.com/) for sponsoring the devel
         <UnitName Value="ClpFixedPointPreCompInfo"/>
       </Item91>
       <Item92>
-        <Filename Value="..\..\Math\EC\Multiplier\ClpFixedPointUtilities.pas"/>
-        <UnitName Value="ClpFixedPointUtilities"/>
-      </Item92>
-      <Item93>
         <Filename Value="..\..\Math\EC\Multiplier\ClpGlvMultiplier.pas"/>
         <UnitName Value="ClpGlvMultiplier"/>
-      </Item93>
-      <Item94>
+      </Item92>
+      <Item93>
         <Filename Value="..\..\Math\EC\Multiplier\ClpWNafL2RMultiplier.pas"/>
         <UnitName Value="ClpWNafL2RMultiplier"/>
-      </Item94>
-      <Item95>
+      </Item93>
+      <Item94>
         <Filename Value="..\..\Math\EC\Multiplier\ClpWNafPreCompInfo.pas"/>
         <UnitName Value="ClpWNafPreCompInfo"/>
-      </Item95>
-      <Item96>
+      </Item94>
+      <Item95>
         <Filename Value="..\..\Math\EC\Multiplier\ClpWTauNafMultiplier.pas"/>
         <UnitName Value="ClpWTauNafMultiplier"/>
-      </Item96>
-      <Item97>
+      </Item95>
+      <Item96>
         <Filename Value="..\..\Math\EC\Multiplier\ClpWTauNafPreCompInfo.pas"/>
         <UnitName Value="ClpWTauNafPreCompInfo"/>
-      </Item97>
-      <Item98>
+      </Item96>
+      <Item97>
         <Filename Value="..\..\Math\Field\ClpFiniteFields.pas"/>
         <UnitName Value="ClpFiniteFields"/>
-      </Item98>
-      <Item99>
+      </Item97>
+      <Item98>
         <Filename Value="..\..\Math\Field\ClpGenericPolynomialExtensionField.pas"/>
         <UnitName Value="ClpGenericPolynomialExtensionField"/>
-      </Item99>
-      <Item100>
+      </Item98>
+      <Item99>
         <Filename Value="..\..\Math\Field\ClpGF2Polynomial.pas"/>
         <UnitName Value="ClpGF2Polynomial"/>
-      </Item100>
-      <Item101>
+      </Item99>
+      <Item100>
         <Filename Value="..\..\Math\Field\ClpPrimeField.pas"/>
         <UnitName Value="ClpPrimeField"/>
-      </Item101>
-      <Item102>
+      </Item100>
+      <Item101>
         <Filename Value="..\..\Math\Raw\ClpMod.pas"/>
         <UnitName Value="ClpMod"/>
-      </Item102>
-      <Item103>
+      </Item101>
+      <Item102>
         <Filename Value="..\..\Math\Raw\ClpNat.pas"/>
         <UnitName Value="ClpNat"/>
-      </Item103>
-      <Item104>
+      </Item102>
+      <Item103>
         <Filename Value="..\..\Security\ClpDigestUtilities.pas"/>
         <UnitName Value="ClpDigestUtilities"/>
-      </Item104>
-      <Item105>
+      </Item103>
+      <Item104>
         <Filename Value="..\..\Security\ClpRandom.pas"/>
         <UnitName Value="ClpRandom"/>
-      </Item105>
-      <Item106>
+      </Item104>
+      <Item105>
         <Filename Value="..\..\Security\ClpSecureRandom.pas"/>
         <UnitName Value="ClpSecureRandom"/>
-      </Item106>
-      <Item107>
+      </Item105>
+      <Item106>
         <Filename Value="..\..\Security\ClpSignerUtilities.pas"/>
         <UnitName Value="ClpSignerUtilities"/>
-      </Item107>
-      <Item108>
+      </Item106>
+      <Item107>
         <Filename Value="..\..\Utils\ClpArrayUtils.pas"/>
         <UnitName Value="ClpArrayUtils"/>
-      </Item108>
-      <Item109>
+      </Item107>
+      <Item108>
         <Filename Value="..\..\Utils\ClpBigIntegers.pas"/>
         <UnitName Value="ClpBigIntegers"/>
-      </Item109>
-      <Item110>
+      </Item108>
+      <Item109>
         <Filename Value="..\..\Utils\ClpBitConverter.pas"/>
         <UnitName Value="ClpBitConverter"/>
-      </Item110>
-      <Item111>
+      </Item109>
+      <Item110>
         <Filename Value="..\..\Utils\ClpBits.pas"/>
         <UnitName Value="ClpBits"/>
-      </Item111>
-      <Item112>
+      </Item110>
+      <Item111>
         <Filename Value="..\..\Utils\ClpConverters.pas"/>
         <UnitName Value="ClpConverters"/>
-      </Item112>
-      <Item113>
+      </Item111>
+      <Item112>
         <Filename Value="..\..\Utils\ClpCryptoLibTypes.pas"/>
         <UnitName Value="ClpCryptoLibTypes"/>
-      </Item113>
-      <Item114>
+      </Item112>
+      <Item113>
         <Filename Value="..\..\Utils\ClpTimes.pas"/>
         <UnitName Value="ClpTimes"/>
-      </Item114>
-      <Item115>
+      </Item113>
+      <Item114>
         <Filename Value="..\..\Utils\Randoms\ClpOSRandom.pas"/>
         <UnitName Value="ClpOSRandom"/>
-      </Item115>
-      <Item116>
+      </Item114>
+      <Item115>
         <Filename Value="..\..\Utils\Rng\ClpRandomNumberGenerator.pas"/>
         <UnitName Value="ClpRandomNumberGenerator"/>
-      </Item116>
-      <Item117>
+      </Item115>
+      <Item116>
         <Filename Value="..\..\Utils\ClpSetWeakRef.pas"/>
         <UnitName Value="ClpSetWeakRef"/>
-      </Item117>
-      <Item118>
+      </Item116>
+      <Item117>
         <Filename Value="..\..\Security\ClpParameterUtilities.pas"/>
         <UnitName Value="ClpParameterUtilities"/>
-      </Item118>
-      <Item119>
+      </Item117>
+      <Item118>
         <Filename Value="..\..\Security\ClpGeneratorUtilities.pas"/>
         <UnitName Value="ClpGeneratorUtilities"/>
-      </Item119>
-      <Item120>
+      </Item118>
+      <Item119>
         <Filename Value="..\..\Security\ClpCipherUtilities.pas"/>
         <UnitName Value="ClpCipherUtilities"/>
-      </Item120>
-      <Item121>
+      </Item119>
+      <Item120>
         <Filename Value="..\..\Interfaces\ClpIAesEngine.pas"/>
         <UnitName Value="ClpIAesEngine"/>
-      </Item121>
-      <Item122>
+      </Item120>
+      <Item121>
         <Filename Value="..\..\Interfaces\ClpIParametersWithIV.pas"/>
         <UnitName Value="ClpIParametersWithIV"/>
-      </Item122>
-      <Item123>
+      </Item121>
+      <Item122>
         <Filename Value="..\..\Interfaces\ClpIPaddedBufferedBlockCipher.pas"/>
         <UnitName Value="ClpIPaddedBufferedBlockCipher"/>
-      </Item123>
-      <Item124>
+      </Item122>
+      <Item123>
         <Filename Value="..\..\Interfaces\ClpIKeyParameter.pas"/>
         <UnitName Value="ClpIKeyParameter"/>
-      </Item124>
-      <Item125>
+      </Item123>
+      <Item124>
         <Filename Value="..\..\Interfaces\ClpIBufferedCipherBase.pas"/>
         <UnitName Value="ClpIBufferedCipherBase"/>
-      </Item125>
-      <Item126>
+      </Item124>
+      <Item125>
         <Filename Value="..\..\Interfaces\ClpIBufferedCipher.pas"/>
         <UnitName Value="ClpIBufferedCipher"/>
-      </Item126>
-      <Item127>
+      </Item125>
+      <Item126>
         <Filename Value="..\..\Interfaces\ClpIBufferedBlockCipher.pas"/>
         <UnitName Value="ClpIBufferedBlockCipher"/>
-      </Item127>
-      <Item128>
+      </Item126>
+      <Item127>
         <Filename Value="..\..\Interfaces\ClpIBlockCipherPadding.pas"/>
         <UnitName Value="ClpIBlockCipherPadding"/>
-      </Item128>
-      <Item129>
+      </Item127>
+      <Item128>
         <Filename Value="..\..\Interfaces\ClpIBlockCipher.pas"/>
         <UnitName Value="ClpIBlockCipher"/>
-      </Item129>
-      <Item130>
+      </Item128>
+      <Item129>
         <Filename Value="..\..\Crypto\Paddings\ClpPaddedBufferedBlockCipher.pas"/>
         <UnitName Value="ClpPaddedBufferedBlockCipher"/>
-      </Item130>
-      <Item131>
+      </Item129>
+      <Item130>
         <Filename Value="..\..\Crypto\Parameters\ClpParametersWithIV.pas"/>
         <UnitName Value="ClpParametersWithIV"/>
-      </Item131>
-      <Item132>
+      </Item130>
+      <Item131>
         <Filename Value="..\..\Crypto\Parameters\ClpKeyParameter.pas"/>
         <UnitName Value="ClpKeyParameter"/>
-      </Item132>
-      <Item133>
+      </Item131>
+      <Item132>
         <Filename Value="..\..\Crypto\ClpBufferedBlockCipher.pas"/>
         <UnitName Value="ClpBufferedBlockCipher"/>
-      </Item133>
-      <Item134>
+      </Item132>
+      <Item133>
         <Filename Value="..\..\Crypto\ClpBufferedCipherBase.pas"/>
         <UnitName Value="ClpBufferedCipherBase"/>
-      </Item134>
-      <Item135>
+      </Item133>
+      <Item134>
         <Filename Value="..\..\Utils\ClpCheck.pas"/>
         <UnitName Value="ClpCheck"/>
-      </Item135>
-      <Item136>
+      </Item134>
+      <Item135>
         <Filename Value="..\..\Crypto\Engines\ClpAesEngine.pas"/>
         <UnitName Value="ClpAesEngine"/>
-      </Item136>
-      <Item137>
+      </Item135>
+      <Item136>
         <Filename Value="..\..\Crypto\Generators\ClpPascalCoinECIESKdfBytesGenerator.pas"/>
         <UnitName Value="ClpPascalCoinECIESKdfBytesGenerator"/>
-      </Item137>
-      <Item138>
+      </Item136>
+      <Item137>
         <Filename Value="..\..\Crypto\Engines\ClpPascalCoinIESEngine.pas"/>
         <UnitName Value="ClpPascalCoinIESEngine"/>
-      </Item138>
-      <Item139>
+      </Item137>
+      <Item138>
         <Filename Value="..\..\Crypto\Generators\ClpBaseKdfBytesGenerator.pas"/>
         <UnitName Value="ClpBaseKdfBytesGenerator"/>
-      </Item139>
-      <Item140>
+      </Item138>
+      <Item139>
         <Filename Value="..\..\Crypto\Engines\ClpIESEngine.pas"/>
         <UnitName Value="ClpIESEngine"/>
-      </Item140>
-      <Item141>
+      </Item139>
+      <Item140>
         <Filename Value="..\..\Crypto\Parsers\ClpECIESPublicKeyParser.pas"/>
         <UnitName Value="ClpECIESPublicKeyParser"/>
-      </Item141>
-      <Item142>
+      </Item140>
+      <Item141>
         <Filename Value="..\..\Crypto\ClpIESCipher.pas"/>
         <UnitName Value="ClpIESCipher"/>
-      </Item142>
-      <Item143>
+      </Item141>
+      <Item142>
         <Filename Value="..\..\Crypto\Agreement\ClpECDHBasicAgreement.pas"/>
         <UnitName Value="ClpECDHBasicAgreement"/>
-      </Item143>
-      <Item144>
+      </Item142>
+      <Item143>
         <Filename Value="..\..\Crypto\ClpEphemeralKeyPair.pas"/>
         <UnitName Value="ClpEphemeralKeyPair"/>
-      </Item144>
-      <Item145>
+      </Item143>
+      <Item144>
         <Filename Value="..\..\Crypto\ClpKeyEncoder.pas"/>
         <UnitName Value="ClpKeyEncoder"/>
-      </Item145>
-      <Item146>
+      </Item144>
+      <Item145>
         <Filename Value="..\..\Crypto\Parameters\ClpIESWithCipherParameters.pas"/>
         <UnitName Value="ClpIESWithCipherParameters"/>
-      </Item146>
-      <Item147>
+      </Item145>
+      <Item146>
         <Filename Value="..\..\Crypto\Parameters\ClpIESParameters.pas"/>
         <UnitName Value="ClpIESParameters"/>
-      </Item147>
-      <Item148>
+      </Item146>
+      <Item147>
         <Filename Value="..\..\Crypto\Generators\ClpEphemeralKeyPairGenerator.pas"/>
         <UnitName Value="ClpEphemeralKeyPairGenerator"/>
-      </Item148>
-      <Item149>
+      </Item147>
+      <Item148>
         <Filename Value="..\..\Crypto\Generators\ClpKdf2BytesGenerator.pas"/>
         <UnitName Value="ClpKdf2BytesGenerator"/>
-      </Item149>
-      <Item150>
+      </Item148>
+      <Item149>
         <Filename Value="..\..\Crypto\Parameters\ClpIso18033KdfParameters.pas"/>
         <UnitName Value="ClpIso18033KdfParameters"/>
-      </Item150>
-      <Item151>
+      </Item149>
+      <Item150>
         <Filename Value="..\..\Crypto\Parameters\ClpKdfParameters.pas"/>
         <UnitName Value="ClpKdfParameters"/>
-      </Item151>
-      <Item152>
+      </Item150>
+      <Item151>
         <Filename Value="..\..\Interfaces\ClpIIESWithCipherParameters.pas"/>
         <UnitName Value="ClpIIESWithCipherParameters"/>
-      </Item152>
-      <Item153>
+      </Item151>
+      <Item152>
         <Filename Value="..\..\Interfaces\ClpIIESParameters.pas"/>
         <UnitName Value="ClpIIESParameters"/>
-      </Item153>
-      <Item154>
+      </Item152>
+      <Item153>
         <Filename Value="..\..\Interfaces\ClpIPascalCoinECIESKdfBytesGenerator.pas"/>
         <UnitName Value="ClpIPascalCoinECIESKdfBytesGenerator"/>
-      </Item154>
-      <Item155>
+      </Item153>
+      <Item154>
         <Filename Value="..\..\Interfaces\ClpIPascalCoinIESEngine.pas"/>
         <UnitName Value="ClpIPascalCoinIESEngine"/>
-      </Item155>
-      <Item156>
+      </Item154>
+      <Item155>
         <Filename Value="..\..\Interfaces\ClpIIESEngine.pas"/>
         <UnitName Value="ClpIIESEngine"/>
-      </Item156>
-      <Item157>
+      </Item155>
+      <Item156>
         <Filename Value="..\..\Interfaces\ClpIIESCipher.pas"/>
         <UnitName Value="ClpIIESCipher"/>
-      </Item157>
-      <Item158>
+      </Item156>
+      <Item157>
         <Filename Value="..\..\Interfaces\ClpIECIESPublicKeyParser.pas"/>
         <UnitName Value="ClpIECIESPublicKeyParser"/>
-      </Item158>
-      <Item159>
+      </Item157>
+      <Item158>
         <Filename Value="..\..\Interfaces\ClpIEphemeralKeyPairGenerator.pas"/>
         <UnitName Value="ClpIEphemeralKeyPairGenerator"/>
-      </Item159>
-      <Item160>
+      </Item158>
+      <Item159>
         <Filename Value="..\..\Interfaces\ClpIEphemeralKeyPair.pas"/>
         <UnitName Value="ClpIEphemeralKeyPair"/>
-      </Item160>
-      <Item161>
+      </Item159>
+      <Item160>
         <Filename Value="..\..\Interfaces\ClpIKeyParser.pas"/>
         <UnitName Value="ClpIKeyParser"/>
-      </Item161>
-      <Item162>
+      </Item160>
+      <Item161>
         <Filename Value="..\..\Interfaces\ClpIKdf2BytesGenerator.pas"/>
         <UnitName Value="ClpIKdf2BytesGenerator"/>
-      </Item162>
-      <Item163>
+      </Item161>
+      <Item162>
         <Filename Value="..\..\Interfaces\ClpIBaseKdfBytesGenerator.pas"/>
         <UnitName Value="ClpIBaseKdfBytesGenerator"/>
-      </Item163>
-      <Item164>
+      </Item162>
+      <Item163>
         <Filename Value="..\..\Interfaces\ClpIIso18033KdfParameters.pas"/>
         <UnitName Value="ClpIIso18033KdfParameters"/>
-      </Item164>
-      <Item165>
+      </Item163>
+      <Item164>
         <Filename Value="..\..\Interfaces\ClpIKdfParameters.pas"/>
         <UnitName Value="ClpIKdfParameters"/>
-      </Item165>
-      <Item166>
+      </Item164>
+      <Item165>
         <Filename Value="..\..\Interfaces\ClpIDerivationFunction.pas"/>
         <UnitName Value="ClpIDerivationFunction"/>
-      </Item166>
-      <Item167>
+      </Item165>
+      <Item166>
         <Filename Value="..\..\Interfaces\ClpIDerivationParameters.pas"/>
         <UnitName Value="ClpIDerivationParameters"/>
-      </Item167>
-      <Item168>
+      </Item166>
+      <Item167>
         <Filename Value="..\..\Interfaces\ClpIECDHBasicAgreement.pas"/>
         <UnitName Value="ClpIECDHBasicAgreement"/>
-      </Item168>
-      <Item169>
+      </Item167>
+      <Item168>
         <Filename Value="..\..\Interfaces\ClpIBasicAgreement.pas"/>
         <UnitName Value="ClpIBasicAgreement"/>
-      </Item169>
-      <Item170>
+      </Item168>
+      <Item169>
         <Filename Value="..\..\Crypto\Generators\ClpCipherKeyGenerator.pas"/>
         <UnitName Value="ClpCipherKeyGenerator"/>
-      </Item170>
-      <Item171>
+      </Item169>
+      <Item170>
         <Filename Value="..\..\Utils\ClpStringUtils.pas"/>
         <UnitName Value="ClpStringUtils"/>
-      </Item171>
-      <Item172>
+      </Item170>
+      <Item171>
         <Filename Value="..\..\Interfaces\ClpICipherKeyGenerator.pas"/>
         <UnitName Value="ClpICipherKeyGenerator"/>
-      </Item172>
-      <Item173>
+      </Item171>
+      <Item172>
         <Filename Value="..\..\Interfaces\ClpIDigest.pas"/>
         <UnitName Value="ClpIDigest"/>
-      </Item173>
-      <Item174>
+      </Item172>
+      <Item173>
         <Filename Value="..\..\Interfaces\ClpIStreamCipher.pas"/>
         <UnitName Value="ClpIStreamCipher"/>
-      </Item174>
-      <Item175>
+      </Item173>
+      <Item174>
         <Filename Value="CryptoLib4PascalPackage.pas"/>
         <AddToUsesPkgSection Value="False"/>
         <UnitName Value="CryptoLib4PascalPackage"/>
-      </Item175>
-      <Item176>
+      </Item174>
+      <Item175>
         <Filename Value="..\..\Crypto\Generators\ClpPkcs5S2ParametersGenerator.pas"/>
         <UnitName Value="ClpPkcs5S2ParametersGenerator"/>
-      </Item176>
-      <Item177>
+      </Item175>
+      <Item176>
         <Filename Value="..\..\Interfaces\ClpIPkcs5S2ParametersGenerator.pas"/>
         <UnitName Value="ClpIPkcs5S2ParametersGenerator"/>
-      </Item177>
-      <Item178>
+      </Item176>
+      <Item177>
         <Filename Value="..\..\Interfaces\ClpIPbeParametersGenerator.pas"/>
         <UnitName Value="ClpIPbeParametersGenerator"/>
-      </Item178>
-      <Item179>
+      </Item177>
+      <Item178>
         <Filename Value="..\..\Crypto\Generators\ClpPbeParametersGenerator.pas"/>
         <UnitName Value="ClpPbeParametersGenerator"/>
-      </Item179>
-      <Item180>
+      </Item178>
+      <Item179>
         <Filename Value="..\..\Crypto\Macs\ClpHMac.pas"/>
         <UnitName Value="ClpHMac"/>
-      </Item180>
-      <Item181>
+      </Item179>
+      <Item180>
         <Filename Value="..\..\Asn1\Misc\ClpMiscObjectIdentifiers.pas"/>
         <UnitName Value="ClpMiscObjectIdentifiers"/>
-      </Item181>
-      <Item182>
+      </Item180>
+      <Item181>
         <Filename Value="..\..\Asn1\Iana\ClpIanaObjectIdentifiers.pas"/>
         <UnitName Value="ClpIanaObjectIdentifiers"/>
-      </Item182>
-      <Item183>
+      </Item181>
+      <Item182>
         <Filename Value="..\..\Security\ClpMacUtilities.pas"/>
         <UnitName Value="ClpMacUtilities"/>
-      </Item183>
-      <Item184>
+      </Item182>
+      <Item183>
         <Filename Value="..\..\Interfaces\ClpIMac.pas"/>
         <UnitName Value="ClpIMac"/>
-      </Item184>
-      <Item185>
+      </Item183>
+      <Item184>
         <Filename Value="..\..\Interfaces\ClpIHMac.pas"/>
         <UnitName Value="ClpIHMac"/>
-      </Item185>
-      <Item186>
+      </Item184>
+      <Item185>
         <Filename Value="..\..\Crypto\Signers\ClpDsaSigner.pas"/>
         <UnitName Value="ClpDsaSigner"/>
-      </Item186>
-      <Item187>
+      </Item185>
+      <Item186>
         <Filename Value="..\..\Crypto\Generators\ClpDsaKeyPairGenerator.pas"/>
         <UnitName Value="ClpDsaKeyPairGenerator"/>
-      </Item187>
-      <Item188>
+      </Item186>
+      <Item187>
         <Filename Value="..\..\Crypto\Signers\ClpECNRSigner.pas"/>
         <UnitName Value="ClpECNRSigner"/>
-      </Item188>
-      <Item189>
+      </Item187>
+      <Item188>
         <Filename Value="..\..\Crypto\Parameters\ClpDsaKeyGenerationParameters.pas"/>
         <UnitName Value="ClpDsaKeyGenerationParameters"/>
-      </Item189>
-      <Item190>
+      </Item188>
+      <Item189>
         <Filename Value="..\..\Crypto\Parameters\ClpDsaPrivateKeyParameters.pas"/>
         <UnitName Value="ClpDsaPrivateKeyParameters"/>
-      </Item190>
-      <Item191>
+      </Item189>
+      <Item190>
         <Filename Value="..\..\Crypto\Parameters\ClpDsaPublicKeyParameters.pas"/>
         <UnitName Value="ClpDsaPublicKeyParameters"/>
-      </Item191>
-      <Item192>
+      </Item190>
+      <Item191>
         <Filename Value="..\..\Crypto\Parameters\ClpDsaValidationParameters.pas"/>
         <UnitName Value="ClpDsaValidationParameters"/>
-      </Item192>
-      <Item193>
+      </Item191>
+      <Item192>
         <Filename Value="..\..\Crypto\Parameters\ClpDsaParameters.pas"/>
         <UnitName Value="ClpDsaParameters"/>
-      </Item193>
-      <Item194>
+      </Item192>
+      <Item193>
         <Filename Value="..\..\Crypto\Parameters\ClpDsaKeyParameters.pas"/>
         <UnitName Value="ClpDsaKeyParameters"/>
-      </Item194>
-      <Item195>
+      </Item193>
+      <Item194>
         <Filename Value="..\..\Interfaces\ClpIECNRSigner.pas"/>
         <UnitName Value="ClpIECNRSigner"/>
-      </Item195>
-      <Item196>
+      </Item194>
+      <Item195>
         <Filename Value="..\..\Interfaces\ClpIDsaSigner.pas"/>
         <UnitName Value="ClpIDsaSigner"/>
-      </Item196>
-      <Item197>
+      </Item195>
+      <Item196>
         <Filename Value="..\..\Interfaces\ClpIDsaKeyPairGenerator.pas"/>
         <UnitName Value="ClpIDsaKeyPairGenerator"/>
-      </Item197>
-      <Item198>
+      </Item196>
+      <Item197>
         <Filename Value="..\..\Interfaces\ClpIDsaPrivateKeyParameters.pas"/>
         <UnitName Value="ClpIDsaPrivateKeyParameters"/>
-      </Item198>
-      <Item199>
+      </Item197>
+      <Item198>
         <Filename Value="..\..\Interfaces\ClpIDsaKeyGenerationParameters.pas"/>
         <UnitName Value="ClpIDsaKeyGenerationParameters"/>
-      </Item199>
-      <Item200>
+      </Item198>
+      <Item199>
         <Filename Value="..\..\Interfaces\ClpIDsaKeyParameters.pas"/>
         <UnitName Value="ClpIDsaKeyParameters"/>
-      </Item200>
-      <Item201>
+      </Item199>
+      <Item200>
         <Filename Value="..\..\Interfaces\ClpIDsaPublicKeyParameters.pas"/>
         <UnitName Value="ClpIDsaPublicKeyParameters"/>
-      </Item201>
-      <Item202>
+      </Item200>
+      <Item201>
         <Filename Value="..\..\Interfaces\ClpIDsaParameters.pas"/>
         <UnitName Value="ClpIDsaParameters"/>
-      </Item202>
-      <Item203>
+      </Item201>
+      <Item202>
         <Filename Value="..\..\Interfaces\ClpIDsaValidationParameters.pas"/>
         <UnitName Value="ClpIDsaValidationParameters"/>
-      </Item203>
-      <Item204>
+      </Item202>
+      <Item203>
         <Filename Value="..\..\Crypto\Digests\ClpDigest.pas"/>
         <UnitName Value="ClpDigest"/>
-      </Item204>
-      <Item205>
+      </Item203>
+      <Item204>
         <Filename Value="..\..\Crypto\Agreement\ClpECDHCBasicAgreement.pas"/>
         <UnitName Value="ClpECDHCBasicAgreement"/>
-      </Item205>
-      <Item206>
+      </Item204>
+      <Item205>
         <Filename Value="..\..\Interfaces\ClpIECDHCBasicAgreement.pas"/>
         <UnitName Value="ClpIECDHCBasicAgreement"/>
-      </Item206>
-      <Item207>
+      </Item205>
+      <Item206>
         <Filename Value="..\..\Crypto\Signers\ClpHMacDsaKCalculator.pas"/>
         <UnitName Value="ClpHMacDsaKCalculator"/>
-      </Item207>
-      <Item208>
+      </Item206>
+      <Item207>
         <Filename Value="..\..\Interfaces\ClpIHMacDsaKCalculator.pas"/>
         <UnitName Value="ClpIHMacDsaKCalculator"/>
-      </Item208>
-      <Item209>
+      </Item207>
+      <Item208>
         <Filename Value="..\..\Crypto\Generators\ClpHkdfBytesGenerator.pas"/>
         <UnitName Value="ClpHkdfBytesGenerator"/>
-      </Item209>
-      <Item210>
+      </Item208>
+      <Item209>
         <Filename Value="..\..\Interfaces\ClpIHkdfBytesGenerator.pas"/>
         <UnitName Value="ClpIHkdfBytesGenerator"/>
-      </Item210>
-      <Item211>
+      </Item209>
+      <Item210>
         <Filename Value="..\..\Crypto\Parameters\ClpHkdfParameters.pas"/>
         <UnitName Value="ClpHkdfParameters"/>
-      </Item211>
-      <Item212>
+      </Item210>
+      <Item211>
         <Filename Value="..\..\Interfaces\ClpIHkdfParameters.pas"/>
         <UnitName Value="ClpIHkdfParameters"/>
-      </Item212>
-      <Item213>
+      </Item211>
+      <Item212>
         <Filename Value="..\..\Crypto\Parameters\ClpDsaParameterGenerationParameters.pas"/>
         <UnitName Value="ClpDsaParameterGenerationParameters"/>
-      </Item213>
-      <Item214>
+      </Item212>
+      <Item213>
         <Filename Value="..\..\Interfaces\ClpIDsaParameterGenerationParameters.pas"/>
         <UnitName Value="ClpIDsaParameterGenerationParameters"/>
-      </Item214>
-      <Item215>
+      </Item213>
+      <Item214>
         <Filename Value="..\..\Interfaces\ClpIValidityPrecompInfo.pas"/>
         <UnitName Value="ClpIValidityPrecompInfo"/>
-      </Item215>
-      <Item216>
+      </Item214>
+      <Item215>
         <Filename Value="..\..\Crypto\Generators\ClpDsaParametersGenerator.pas"/>
         <UnitName Value="ClpDsaParametersGenerator"/>
-      </Item216>
-      <Item217>
+      </Item215>
+      <Item216>
         <Filename Value="..\..\Asn1\X509\ClpDsaParameter.pas"/>
         <UnitName Value="ClpDsaParameter"/>
-      </Item217>
-      <Item218>
+      </Item216>
+      <Item217>
         <Filename Value="..\..\Interfaces\ClpIDsaParameter.pas"/>
         <UnitName Value="ClpIDsaParameter"/>
-      </Item218>
-      <Item219>
+      </Item217>
+      <Item218>
         <Filename Value="..\..\Interfaces\ClpIKeyEncoder.pas"/>
         <UnitName Value="ClpIKeyEncoder"/>
-      </Item219>
-      <Item220>
+      </Item218>
+      <Item219>
         <Filename Value="..\..\Interfaces\ClpIDsaParametersGenerator.pas"/>
         <UnitName Value="ClpIDsaParametersGenerator"/>
-      </Item220>
-      <Item221>
+      </Item219>
+      <Item220>
         <Filename Value="..\..\Interfaces\ClpIPreCompCallBack.pas"/>
         <UnitName Value="ClpIPreCompCallBack"/>
-      </Item221>
-      <Item222>
+      </Item220>
+      <Item221>
         <Filename Value="..\..\Math\EC\Multiplier\ClpValidityPrecompInfo.pas"/>
         <AddToUsesPkgSection Value="False"/>
         <UnitName Value="ClpValidityPrecompInfo"/>
-      </Item222>
-      <Item223>
+      </Item221>
+      <Item222>
         <Filename Value="..\..\Asn1\Nist\ClpNistNamedCurves.pas"/>
         <UnitName Value="ClpNistNamedCurves"/>
-      </Item223>
-      <Item224>
+      </Item222>
+      <Item223>
         <Filename Value="..\..\Math\Raw\ClpNat256.pas"/>
         <UnitName Value="ClpNat256"/>
-      </Item224>
-      <Item225>
+      </Item223>
+      <Item224>
         <Filename Value="..\..\Math\Raw\ClpNat320.pas"/>
         <UnitName Value="ClpNat320"/>
-      </Item225>
-      <Item226>
+      </Item224>
+      <Item225>
         <Filename Value="..\..\Crypto\Engines\ClpAesLightEngine.pas"/>
         <UnitName Value="ClpAesLightEngine"/>
-      </Item226>
-      <Item227>
+      </Item225>
+      <Item226>
         <Filename Value="..\..\Interfaces\ClpIAesLightEngine.pas"/>
         <UnitName Value="ClpIAesLightEngine"/>
-      </Item227>
-      <Item228>
+      </Item226>
+      <Item227>
         <Filename Value="..\..\Crypto\EC\ClpCustomNamedCurves.pas"/>
         <UnitName Value="ClpCustomNamedCurves"/>
-      </Item228>
-      <Item229>
+      </Item227>
+      <Item228>
         <Filename Value="..\..\Math\Raw\ClpNat384.pas"/>
         <UnitName Value="ClpNat384"/>
-      </Item229>
-      <Item230>
+      </Item228>
+      <Item229>
         <Filename Value="..\..\Math\Raw\ClpNat192.pas"/>
         <UnitName Value="ClpNat192"/>
-      </Item230>
-      <Item231>
+      </Item229>
+      <Item230>
         <Filename Value="..\..\Math\Raw\ClpNat512.pas"/>
         <UnitName Value="ClpNat512"/>
-      </Item231>
-      <Item232>
+      </Item230>
+      <Item231>
         <Filename Value="..\..\Math\Raw\ClpInterleave.pas"/>
         <UnitName Value="ClpInterleave"/>
-      </Item232>
-      <Item233>
+      </Item231>
+      <Item232>
         <Filename Value="..\..\Asn1\Bsi\ClpBsiObjectIdentifiers.pas"/>
         <UnitName Value="ClpBsiObjectIdentifiers"/>
-      </Item233>
-      <Item234>
+      </Item232>
+      <Item233>
         <Filename Value="..\..\Asn1\Eac\ClpEacObjectIdentifiers.pas"/>
         <UnitName Value="ClpEacObjectIdentifiers"/>
-      </Item234>
-      <Item235>
+      </Item233>
+      <Item234>
         <Filename Value="..\..\Interfaces\ClpIDsaExt.pas"/>
         <UnitName Value="ClpIDsaExt"/>
-      </Item235>
-      <Item236>
+      </Item234>
+      <Item235>
         <Filename Value="..\..\Interfaces\ClpISchnorrDigestSigner.pas"/>
         <UnitName Value="ClpISchnorrDigestSigner"/>
-      </Item236>
-      <Item237>
+      </Item235>
+      <Item236>
         <Filename Value="..\..\Interfaces\ClpIECSchnorrSipaSigner.pas"/>
         <UnitName Value="ClpIECSchnorrSipaSigner"/>
-      </Item237>
-      <Item238>
+      </Item236>
+      <Item237>
         <Filename Value="..\..\Crypto\Signers\ClpECSchnorrSipaSigner.pas"/>
         <UnitName Value="ClpECSchnorrSipaSigner"/>
-      </Item238>
-      <Item239>
+      </Item237>
+      <Item238>
         <Filename Value="..\..\Crypto\Signers\ClpSchnorrDigestSigner.pas"/>
         <UnitName Value="ClpSchnorrDigestSigner"/>
-      </Item239>
-      <Item240>
+      </Item238>
+      <Item239>
         <Filename Value="..\..\Interfaces\ClpISchnorr.pas"/>
         <UnitName Value="ClpISchnorr"/>
-      </Item240>
-      <Item241>
+      </Item239>
+      <Item240>
         <Filename Value="..\..\Interfaces\ClpISchnorrExt.pas"/>
         <UnitName Value="ClpISchnorrExt"/>
-      </Item241>
-      <Item242>
+      </Item240>
+      <Item241>
         <Filename Value="..\..\Crypto\Engines\ClpBlowfishEngine.pas"/>
         <UnitName Value="ClpBlowfishEngine"/>
-      </Item242>
-      <Item243>
+      </Item241>
+      <Item242>
         <Filename Value="..\..\Interfaces\ClpIBlowfishEngine.pas"/>
         <UnitName Value="ClpIBlowfishEngine"/>
-      </Item243>
-      <Item244>
+      </Item242>
+      <Item243>
         <Filename Value="..\..\Math\EC\ClpECC.pas"/>
         <UnitName Value="ClpECC"/>
-      </Item244>
-      <Item245>
+      </Item243>
+      <Item244>
         <Filename Value="..\..\Asn1\ClpAsn1Objects.pas"/>
         <UnitName Value="ClpAsn1Objects"/>
-      </Item245>
-      <Item246>
+      </Item244>
+      <Item245>
         <Filename Value="..\..\Crypto\Signers\SignersEncodings\ClpSignersEncodings.pas"/>
         <UnitName Value="ClpSignersEncodings"/>
-      </Item246>
-      <Item247>
+      </Item245>
+      <Item246>
         <Filename Value="..\..\Interfaces\ClpISignersEncodings.pas"/>
         <UnitName Value="ClpISignersEncodings"/>
-      </Item247>
-      <Item248>
+      </Item246>
+      <Item247>
         <Filename Value="..\..\Utils\Encoders\ClpEncoders.pas"/>
         <UnitName Value="ClpEncoders"/>
-      </Item248>
-      <Item249>
+      </Item247>
+      <Item248>
         <Filename Value="..\..\Math\EC\Custom\Sec\ClpSecT283Custom.pas"/>
         <UnitName Value="ClpSecT283Custom"/>
-      </Item249>
-      <Item250>
+      </Item248>
+      <Item249>
         <Filename Value="..\..\Math\EC\Custom\Sec\ClpSecP521R1Custom.pas"/>
         <UnitName Value="ClpSecP521R1Custom"/>
-      </Item250>
-      <Item251>
+      </Item249>
+      <Item250>
         <Filename Value="..\..\Math\EC\Custom\Sec\ClpSecP384R1Custom.pas"/>
         <UnitName Value="ClpSecP384R1Custom"/>
-      </Item251>
-      <Item252>
+      </Item250>
+      <Item251>
         <Filename Value="..\..\Math\EC\Custom\Sec\ClpSecP256R1Custom.pas"/>
         <UnitName Value="ClpSecP256R1Custom"/>
-      </Item252>
-      <Item253>
+      </Item251>
+      <Item252>
         <Filename Value="..\..\Math\EC\Custom\Sec\ClpSecP256K1Custom.pas"/>
         <UnitName Value="ClpSecP256K1Custom"/>
-      </Item253>
-      <Item254>
+      </Item252>
+      <Item253>
         <Filename Value="..\..\Interfaces\ClpIX9ECC.pas"/>
         <UnitName Value="ClpIX9ECC"/>
-      </Item254>
-      <Item255>
+      </Item253>
+      <Item254>
         <Filename Value="..\..\Asn1\X9\ClpX9ECC.pas"/>
         <UnitName Value="ClpX9ECC"/>
-      </Item255>
-      <Item256>
+      </Item254>
+      <Item255>
         <Filename Value="..\..\Interfaces\ClpIAsn1Objects.pas"/>
         <UnitName Value="ClpIAsn1Objects"/>
-      </Item256>
-      <Item257>
+      </Item255>
+      <Item256>
         <Filename Value="..\..\Crypto\Modes\ClpBlockCipherModes.pas"/>
         <UnitName Value="ClpBlockCipherModes"/>
-      </Item257>
-      <Item258>
+      </Item256>
+      <Item257>
         <Filename Value="..\..\Math\EC\ClpECCurveConstants.pas"/>
         <UnitName Value="ClpECCurveConstants"/>
-      </Item258>
-      <Item259>
+      </Item257>
+      <Item258>
         <Filename Value="..\..\Interfaces\ClpIBlockCipherModes.pas"/>
         <UnitName Value="ClpIBlockCipherModes"/>
-      </Item259>
-      <Item260>
+      </Item258>
+      <Item259>
         <Filename Value="..\..\Interfaces\ClpIPaddingModes.pas"/>
         <UnitName Value="ClpIPaddingModes"/>
-      </Item260>
-      <Item261>
+      </Item259>
+      <Item260>
         <Filename Value="..\..\Interfaces\ClpISecP256K1Custom.pas"/>
         <UnitName Value="ClpISecP256K1Custom"/>
-      </Item261>
-      <Item262>
+      </Item260>
+      <Item261>
         <Filename Value="..\..\Interfaces\ClpISecP256R1Custom.pas"/>
         <UnitName Value="ClpISecP256R1Custom"/>
-      </Item262>
-      <Item263>
+      </Item261>
+      <Item262>
         <Filename Value="..\..\Interfaces\ClpISecP384R1Custom.pas"/>
         <UnitName Value="ClpISecP384R1Custom"/>
-      </Item263>
-      <Item264>
+      </Item262>
+      <Item263>
         <Filename Value="..\..\Interfaces\ClpISecP521R1Custom.pas"/>
         <UnitName Value="ClpISecP521R1Custom"/>
-      </Item264>
-      <Item265>
+      </Item263>
+      <Item264>
         <Filename Value="..\..\Interfaces\ClpISecT283Custom.pas"/>
         <UnitName Value="ClpISecT283Custom"/>
-      </Item265>
-      <Item266>
+      </Item264>
+      <Item265>
         <Filename Value="..\..\Crypto\Paddings\ClpPaddingModes.pas"/>
         <UnitName Value="ClpPaddingModes"/>
-      </Item266>
-      <Item267>
+      </Item265>
+      <Item266>
         <Filename Value="..\..\Interfaces\ClpIECC.pas"/>
         <UnitName Value="ClpIECC"/>
-      </Item267>
-      <Item268>
+      </Item266>
+      <Item267>
         <Filename Value="..\..\Interfaces\ClpISpeckEngine.pas"/>
         <UnitName Value="ClpISpeckEngine"/>
-      </Item268>
-      <Item269>
+      </Item267>
+      <Item268>
         <Filename Value="..\..\Crypto\Engines\ClpSpeckEngine.pas"/>
         <UnitName Value="ClpSpeckEngine"/>
-      </Item269>
-      <Item270>
+      </Item268>
+      <Item269>
         <Filename Value="..\..\Interfaces\ClpIBufferedStreamCipher.pas"/>
         <UnitName Value="ClpIBufferedStreamCipher"/>
-      </Item270>
-      <Item271>
+      </Item269>
+      <Item270>
         <Filename Value="..\..\Interfaces\ClpIChaChaEngine.pas"/>
         <UnitName Value="ClpIChaChaEngine"/>
-      </Item271>
-      <Item272>
+      </Item270>
+      <Item271>
         <Filename Value="..\..\Interfaces\ClpIXSalsa20Engine.pas"/>
         <UnitName Value="ClpIXSalsa20Engine"/>
-      </Item272>
-      <Item273>
+      </Item271>
+      <Item272>
         <Filename Value="..\..\Interfaces\ClpISalsa20Engine.pas"/>
         <UnitName Value="ClpISalsa20Engine"/>
-      </Item273>
-      <Item274>
+      </Item272>
+      <Item273>
         <Filename Value="..\..\Crypto\ClpBufferedStreamCipher.pas"/>
         <UnitName Value="ClpBufferedStreamCipher"/>
-      </Item274>
-      <Item275>
+      </Item273>
+      <Item274>
         <Filename Value="..\..\Crypto\Engines\ClpSalsa20Engine.pas"/>
         <UnitName Value="ClpSalsa20Engine"/>
-      </Item275>
-      <Item276>
+      </Item274>
+      <Item275>
         <Filename Value="..\..\Crypto\Engines\ClpXSalsa20Engine.pas"/>
         <UnitName Value="ClpXSalsa20Engine"/>
-      </Item276>
-      <Item277>
+      </Item275>
+      <Item276>
         <Filename Value="..\..\Crypto\Engines\ClpChaChaEngine.pas"/>
         <UnitName Value="ClpChaChaEngine"/>
-      </Item277>
-      <Item278>
+      </Item276>
+      <Item277>
         <Filename Value="..\..\Interfaces\ClpIRijndaelEngine.pas"/>
         <UnitName Value="ClpIRijndaelEngine"/>
-      </Item278>
-      <Item279>
+      </Item277>
+      <Item278>
         <Filename Value="..\..\Crypto\Engines\ClpRijndaelEngine.pas"/>
         <UnitName Value="ClpRijndaelEngine"/>
-      </Item279>
-      <Item280>
+      </Item278>
+      <Item279>
         <Filename Value="..\..\Interfaces\ClpIIESParameterSpec.pas"/>
         <UnitName Value="ClpIIESParameterSpec"/>
-      </Item280>
-      <Item281>
+      </Item279>
+      <Item280>
         <Filename Value="..\..\Interfaces\ClpIAlgorithmParameterSpec.pas"/>
         <UnitName Value="ClpIAlgorithmParameterSpec"/>
-      </Item281>
-      <Item282>
+      </Item280>
+      <Item281>
         <Filename Value="..\..\Crypto\Parameters\ClpIESParameterSpec.pas"/>
         <UnitName Value="ClpIESParameterSpec"/>
-      </Item282>
-      <Item283>
+      </Item281>
+      <Item282>
         <Filename Value="..\..\Math\EC\Custom\Djb\ClpCurve25519Custom.pas"/>
         <UnitName Value="ClpCurve25519Custom"/>
-      </Item283>
-      <Item284>
+      </Item282>
+      <Item283>
         <Filename Value="..\..\Interfaces\ClpICurve25519Custom.pas"/>
         <UnitName Value="ClpICurve25519Custom"/>
-      </Item284>
-      <Item285>
+      </Item283>
+      <Item284>
         <Filename Value="..\..\Crypto\Engines\ClpSpeckLegacyEngine.pas"/>
         <UnitName Value="ClpSpeckLegacyEngine"/>
-      </Item285>
-      <Item286>
+      </Item284>
+      <Item285>
         <Filename Value="..\..\Interfaces\ClpISpeckLegacyEngine.pas"/>
         <UnitName Value="ClpISpeckLegacyEngine"/>
-      </Item286>
-      <Item287>
+      </Item285>
+      <Item286>
         <Filename Value="..\..\Interfaces\ClpIEd25519.pas"/>
         <UnitName Value="ClpIEd25519"/>
-      </Item287>
-      <Item288>
+      </Item286>
+      <Item287>
         <Filename Value="..\..\Interfaces\ClpIEd25519Blake2B.pas"/>
         <UnitName Value="ClpIEd25519Blake2B"/>
-      </Item288>
-      <Item289>
+      </Item287>
+      <Item288>
         <Filename Value="..\..\Math\EC\Rfc7748\ClpX25519Field.pas"/>
         <UnitName Value="ClpX25519Field"/>
-      </Item289>
-      <Item290>
+      </Item288>
+      <Item289>
         <Filename Value="..\..\Math\EC\Rfc8032\ClpEd25519.pas"/>
         <UnitName Value="ClpEd25519"/>
-      </Item290>
-      <Item291>
+      </Item289>
+      <Item290>
         <Filename Value="..\..\Math\EC\Rfc8032\ClpEd25519Blake2B.pas"/>
         <UnitName Value="ClpEd25519Blake2B"/>
-      </Item291>
-      <Item292>
+      </Item290>
+      <Item291>
         <Filename Value="..\..\Math\EC\Rfc7748\ClpX25519.pas"/>
         <UnitName Value="ClpX25519"/>
-      </Item292>
-      <Item293>
+      </Item291>
+      <Item292>
         <Filename Value="..\..\Asn1\Edec\ClpEdECObjectIdentifiers.pas"/>
         <UnitName Value="ClpEdECObjectIdentifiers"/>
-      </Item293>
-      <Item294>
+      </Item292>
+      <Item293>
         <Filename Value="..\..\Interfaces\ClpIEd25519CtxBlake2BSigner.pas"/>
         <UnitName Value="ClpIEd25519CtxBlake2BSigner"/>
-      </Item294>
-      <Item295>
+      </Item293>
+      <Item294>
         <Filename Value="..\..\Interfaces\ClpIEd25519PhBlake2BSigner.pas"/>
         <UnitName Value="ClpIEd25519PhBlake2BSigner"/>
-      </Item295>
-      <Item296>
+      </Item294>
+      <Item295>
         <Filename Value="..\..\Interfaces\ClpIEd25519PhSigner.pas"/>
         <UnitName Value="ClpIEd25519PhSigner"/>
-      </Item296>
-      <Item297>
+      </Item295>
+      <Item296>
         <Filename Value="..\..\Interfaces\ClpIEd25519CtxSigner.pas"/>
         <UnitName Value="ClpIEd25519CtxSigner"/>
-      </Item297>
-      <Item298>
+      </Item296>
+      <Item297>
         <Filename Value="..\..\Interfaces\ClpIEd25519Blake2BSigner.pas"/>
         <UnitName Value="ClpIEd25519Blake2BSigner"/>
-      </Item298>
-      <Item299>
+      </Item297>
+      <Item298>
         <Filename Value="..\..\Interfaces\ClpIEd25519Signer.pas"/>
         <UnitName Value="ClpIEd25519Signer"/>
-      </Item299>
-      <Item300>
+      </Item298>
+      <Item299>
         <Filename Value="..\..\Interfaces\ClpIEd25519Blake2BKeyGenerationParameters.pas"/>
         <UnitName Value="ClpIEd25519Blake2BKeyGenerationParameters"/>
-      </Item300>
-      <Item301>
+      </Item299>
+      <Item300>
         <Filename Value="..\..\Interfaces\ClpIEd25519KeyGenerationParameters.pas"/>
         <UnitName Value="ClpIEd25519KeyGenerationParameters"/>
-      </Item301>
-      <Item302>
+      </Item300>
+      <Item301>
         <Filename Value="..\..\Interfaces\ClpIX25519KeyGenerationParameters.pas"/>
         <UnitName Value="ClpIX25519KeyGenerationParameters"/>
-      </Item302>
-      <Item303>
+      </Item301>
+      <Item302>
         <Filename Value="..\..\Interfaces\ClpIEd25519Blake2BKeyPairGenerator.pas"/>
         <UnitName Value="ClpIEd25519Blake2BKeyPairGenerator"/>
-      </Item303>
-      <Item304>
+      </Item302>
+      <Item303>
         <Filename Value="..\..\Interfaces\ClpIEd25519KeyPairGenerator.pas"/>
         <UnitName Value="ClpIEd25519KeyPairGenerator"/>
-      </Item304>
-      <Item305>
+      </Item303>
+      <Item304>
         <Filename Value="..\..\Interfaces\ClpIX25519KeyPairGenerator.pas"/>
         <UnitName Value="ClpIX25519KeyPairGenerator"/>
-      </Item305>
-      <Item306>
+      </Item304>
+      <Item305>
         <Filename Value="..\..\Interfaces\ClpIEd25519Blake2BPrivateKeyParameters.pas"/>
         <UnitName Value="ClpIEd25519Blake2BPrivateKeyParameters"/>
-      </Item306>
-      <Item307>
+      </Item305>
+      <Item306>
         <Filename Value="..\..\Interfaces\ClpIEd25519Blake2BPublicKeyParameters.pas"/>
         <UnitName Value="ClpIEd25519Blake2BPublicKeyParameters"/>
-      </Item307>
-      <Item308>
+      </Item306>
+      <Item307>
         <Filename Value="..\..\Interfaces\ClpIEd25519PrivateKeyParameters.pas"/>
         <UnitName Value="ClpIEd25519PrivateKeyParameters"/>
-      </Item308>
-      <Item309>
+      </Item307>
+      <Item308>
         <Filename Value="..\..\Interfaces\ClpIEd25519PublicKeyParameters.pas"/>
         <UnitName Value="ClpIEd25519PublicKeyParameters"/>
-      </Item309>
-      <Item310>
+      </Item308>
+      <Item309>
         <Filename Value="..\..\Interfaces\ClpIX25519PublicKeyParameters.pas"/>
         <UnitName Value="ClpIX25519PublicKeyParameters"/>
-      </Item310>
-      <Item311>
+      </Item309>
+      <Item310>
         <Filename Value="..\..\Interfaces\ClpIX25519PrivateKeyParameters.pas"/>
         <UnitName Value="ClpIX25519PrivateKeyParameters"/>
-      </Item311>
-      <Item312>
+      </Item310>
+      <Item311>
         <Filename Value="..\..\Interfaces\ClpIX25519Agreement.pas"/>
         <UnitName Value="ClpIX25519Agreement"/>
-      </Item312>
-      <Item313>
+      </Item311>
+      <Item312>
         <Filename Value="..\..\Interfaces\ClpIRawAgreement.pas"/>
         <UnitName Value="ClpIRawAgreement"/>
-      </Item313>
-      <Item314>
+      </Item312>
+      <Item313>
         <Filename Value="..\..\Crypto\Agreement\ClpX25519Agreement.pas"/>
         <UnitName Value="ClpX25519Agreement"/>
-      </Item314>
-      <Item315>
+      </Item313>
+      <Item314>
         <Filename Value="..\..\Crypto\Parameters\ClpEd25519Blake2BKeyGenerationParameters.pas"/>
         <UnitName Value="ClpEd25519Blake2BKeyGenerationParameters"/>
-      </Item315>
-      <Item316>
+      </Item314>
+      <Item315>
         <Filename Value="..\..\Crypto\Parameters\ClpEd25519KeyGenerationParameters.pas"/>
         <UnitName Value="ClpEd25519KeyGenerationParameters"/>
-      </Item316>
-      <Item317>
+      </Item315>
+      <Item316>
         <Filename Value="..\..\Crypto\Parameters\ClpX25519KeyGenerationParameters.pas"/>
         <UnitName Value="ClpX25519KeyGenerationParameters"/>
-      </Item317>
-      <Item318>
+      </Item316>
+      <Item317>
         <Filename Value="..\..\Crypto\Parameters\ClpEd25519Blake2BPrivateKeyParameters.pas"/>
         <UnitName Value="ClpEd25519Blake2BPrivateKeyParameters"/>
-      </Item318>
-      <Item319>
+      </Item317>
+      <Item318>
         <Filename Value="..\..\Crypto\Parameters\ClpEd25519Blake2BPublicKeyParameters.pas"/>
         <UnitName Value="ClpEd25519Blake2BPublicKeyParameters"/>
-      </Item319>
-      <Item320>
+      </Item318>
+      <Item319>
         <Filename Value="..\..\Crypto\Parameters\ClpEd25519PublicKeyParameters.pas"/>
         <UnitName Value="ClpEd25519PublicKeyParameters"/>
-      </Item320>
-      <Item321>
+      </Item319>
+      <Item320>
         <Filename Value="..\..\Crypto\Parameters\ClpEd25519PrivateKeyParameters.pas"/>
         <UnitName Value="ClpEd25519PrivateKeyParameters"/>
-      </Item321>
-      <Item322>
+      </Item320>
+      <Item321>
         <Filename Value="..\..\Crypto\Parameters\ClpX25519PublicKeyParameters.pas"/>
         <UnitName Value="ClpX25519PublicKeyParameters"/>
-      </Item322>
-      <Item323>
+      </Item321>
+      <Item322>
         <Filename Value="..\..\Crypto\Parameters\ClpX25519PrivateKeyParameters.pas"/>
         <UnitName Value="ClpX25519PrivateKeyParameters"/>
-      </Item323>
-      <Item324>
+      </Item322>
+      <Item323>
         <Filename Value="..\..\Crypto\Generators\ClpEd25519Blake2BKeyPairGenerator.pas"/>
         <UnitName Value="ClpEd25519Blake2BKeyPairGenerator"/>
-      </Item324>
-      <Item325>
+      </Item323>
+      <Item324>
         <Filename Value="..\..\Crypto\Generators\ClpEd25519KeyPairGenerator.pas"/>
         <UnitName Value="ClpEd25519KeyPairGenerator"/>
-      </Item325>
-      <Item326>
+      </Item324>
+      <Item325>
         <Filename Value="..\..\Crypto\Generators\ClpX25519KeyPairGenerator.pas"/>
         <UnitName Value="ClpX25519KeyPairGenerator"/>
-      </Item326>
-      <Item327>
+      </Item325>
+      <Item326>
         <Filename Value="..\..\Crypto\Signers\ClpEd25519PhBlake2BSigner.pas"/>
         <UnitName Value="ClpEd25519PhBlake2BSigner"/>
-      </Item327>
-      <Item328>
+      </Item326>
+      <Item327>
         <Filename Value="..\..\Crypto\Signers\ClpEd25519PhSigner.pas"/>
         <UnitName Value="ClpEd25519PhSigner"/>
-      </Item328>
-      <Item329>
+      </Item327>
+      <Item328>
         <Filename Value="..\..\Crypto\Signers\ClpEd25519Signer.pas"/>
         <UnitName Value="ClpEd25519Signer"/>
-      </Item329>
-      <Item330>
+      </Item328>
+      <Item329>
         <Filename Value="..\..\Crypto\Signers\ClpEd25519CtxBlake2BSigner.pas"/>
         <UnitName Value="ClpEd25519CtxBlake2BSigner"/>
-      </Item330>
-      <Item331>
+      </Item329>
+      <Item330>
         <Filename Value="..\..\Crypto\Signers\ClpEd25519CtxSigner.pas"/>
         <UnitName Value="ClpEd25519CtxSigner"/>
-      </Item331>
-      <Item332>
+      </Item330>
+      <Item331>
         <Filename Value="..\..\Crypto\Signers\ClpEd25519Blake2BSigner.pas"/>
         <UnitName Value="ClpEd25519Blake2BSigner"/>
-      </Item332>
-      <Item333>
+      </Item331>
+      <Item332>
         <Filename Value="..\..\Asn1\TeleTrust\ClpTeleTrusTNamedCurves.pas"/>
         <UnitName Value="ClpTeleTrusTNamedCurves"/>
-      </Item333>
-      <Item334>
+      </Item332>
+      <Item333>
         <Filename Value="..\..\Security\ClpAgreementUtilities.pas"/>
         <UnitName Value="ClpAgreementUtilities"/>
-      </Item334>
-      <Item335>
+      </Item333>
+      <Item334>
         <Filename Value="..\..\Interfaces\ClpIKdf1BytesGenerator.pas"/>
         <UnitName Value="ClpIKdf1BytesGenerator"/>
-      </Item335>
-      <Item336>
+      </Item334>
+      <Item335>
         <Filename Value="..\..\Crypto\Generators\ClpKdf1BytesGenerator.pas"/>
         <UnitName Value="ClpKdf1BytesGenerator"/>
-      </Item336>
-      <Item337>
+      </Item335>
+      <Item336>
         <Filename Value="..\..\Interfaces\ClpIArgon2ParametersGenerator.pas"/>
         <UnitName Value="ClpIArgon2ParametersGenerator"/>
-      </Item337>
-      <Item338>
+      </Item336>
+      <Item337>
         <Filename Value="..\..\Crypto\Generators\ClpArgon2ParametersGenerator.pas"/>
         <UnitName Value="ClpArgon2ParametersGenerator"/>
-      </Item338>
-      <Item339>
+      </Item337>
+      <Item338>
         <Filename Value="..\..\Interfaces\ClpIScryptParametersGenerator.pas"/>
         <UnitName Value="ClpIScryptParametersGenerator"/>
-      </Item339>
-      <Item340>
+      </Item338>
+      <Item339>
         <Filename Value="..\..\Crypto\Generators\ClpScryptParametersGenerator.pas"/>
         <UnitName Value="ClpScryptParametersGenerator"/>
-      </Item340>
-      <Item341>
+      </Item339>
+      <Item340>
         <Filename Value="..\..\Interfaces\ClpIDHAgreement.pas"/>
         <UnitName Value="ClpIDHAgreement"/>
-      </Item341>
-      <Item342>
+      </Item340>
+      <Item341>
         <Filename Value="..\..\Interfaces\ClpIDHBasicAgreement.pas"/>
         <UnitName Value="ClpIDHBasicAgreement"/>
-      </Item342>
-      <Item343>
+      </Item341>
+      <Item342>
         <Filename Value="..\..\Interfaces\ClpIDHBasicKeyPairGenerator.pas"/>
         <UnitName Value="ClpIDHBasicKeyPairGenerator"/>
-      </Item343>
-      <Item344>
+      </Item342>
+      <Item343>
         <Filename Value="..\..\Interfaces\ClpIDHKeyPairGenerator.pas"/>
         <UnitName Value="ClpIDHKeyPairGenerator"/>
-      </Item344>
-      <Item345>
+      </Item343>
+      <Item344>
         <Filename Value="..\..\Interfaces\ClpIDHPrivateKeyParameters.pas"/>
         <UnitName Value="ClpIDHPrivateKeyParameters"/>
-      </Item345>
-      <Item346>
+      </Item344>
+      <Item345>
         <Filename Value="..\..\Interfaces\ClpIDHPublicKeyParameters.pas"/>
         <UnitName Value="ClpIDHPublicKeyParameters"/>
-      </Item346>
-      <Item347>
+      </Item345>
+      <Item346>
         <Filename Value="..\..\Interfaces\ClpIDHParametersGenerator.pas"/>
         <UnitName Value="ClpIDHParametersGenerator"/>
-      </Item347>
-      <Item348>
+      </Item346>
+      <Item347>
         <Filename Value="..\..\Interfaces\ClpIDHKeyGenerationParameters.pas"/>
         <UnitName Value="ClpIDHKeyGenerationParameters"/>
-      </Item348>
-      <Item349>
+      </Item347>
+      <Item348>
         <Filename Value="..\..\Interfaces\ClpIDHParameters.pas"/>
         <UnitName Value="ClpIDHParameters"/>
-      </Item349>
-      <Item350>
+      </Item348>
+      <Item349>
         <Filename Value="..\..\Interfaces\ClpIDHKeyGeneratorHelper.pas"/>
         <UnitName Value="ClpIDHKeyGeneratorHelper"/>
-      </Item350>
-      <Item351>
+      </Item349>
+      <Item350>
         <Filename Value="..\..\Interfaces\ClpIDHKeyParameters.pas"/>
         <UnitName Value="ClpIDHKeyParameters"/>
-      </Item351>
-      <Item352>
+      </Item350>
+      <Item351>
         <Filename Value="..\..\Interfaces\ClpIDHValidationParameters.pas"/>
         <UnitName Value="ClpIDHValidationParameters"/>
-      </Item352>
-      <Item353>
+      </Item351>
+      <Item352>
         <Filename Value="..\..\Interfaces\ClpIDHDomainParameters.pas"/>
         <UnitName Value="ClpIDHDomainParameters"/>
-      </Item353>
-      <Item354>
+      </Item352>
+      <Item353>
         <Filename Value="..\..\Interfaces\ClpIDHValidationParams.pas"/>
         <UnitName Value="ClpIDHValidationParams"/>
-      </Item354>
-      <Item355>
+      </Item353>
+      <Item354>
         <Filename Value="..\..\Crypto\Agreement\ClpDHAgreement.pas"/>
         <UnitName Value="ClpDHAgreement"/>
-      </Item355>
-      <Item356>
+      </Item354>
+      <Item355>
         <Filename Value="..\..\Crypto\Agreement\ClpDHBasicAgreement.pas"/>
         <UnitName Value="ClpDHBasicAgreement"/>
-      </Item356>
-      <Item357>
+      </Item355>
+      <Item356>
         <Filename Value="..\..\Crypto\Generators\ClpDHBasicKeyPairGenerator.pas"/>
         <UnitName Value="ClpDHBasicKeyPairGenerator"/>
-      </Item357>
-      <Item358>
+      </Item356>
+      <Item357>
         <Filename Value="..\..\Crypto\Generators\ClpDHKeyPairGenerator.pas"/>
         <UnitName Value="ClpDHKeyPairGenerator"/>
-      </Item358>
-      <Item359>
+      </Item357>
+      <Item358>
         <Filename Value="..\..\Crypto\Generators\ClpDHParametersGenerator.pas"/>
         <UnitName Value="ClpDHParametersGenerator"/>
-      </Item359>
-      <Item360>
+      </Item358>
+      <Item359>
         <Filename Value="..\..\Crypto\Generators\ClpDHKeyGeneratorHelper.pas"/>
         <UnitName Value="ClpDHKeyGeneratorHelper"/>
-      </Item360>
-      <Item361>
+      </Item359>
+      <Item360>
         <Filename Value="..\..\Crypto\Generators\ClpDHParametersHelper.pas"/>
         <UnitName Value="ClpDHParametersHelper"/>
-      </Item361>
-      <Item362>
+      </Item360>
+      <Item361>
         <Filename Value="..\..\Crypto\Parameters\ClpDHPrivateKeyParameters.pas"/>
         <UnitName Value="ClpDHPrivateKeyParameters"/>
-      </Item362>
-      <Item363>
+      </Item361>
+      <Item362>
         <Filename Value="..\..\Crypto\Parameters\ClpDHPublicKeyParameters.pas"/>
         <UnitName Value="ClpDHPublicKeyParameters"/>
-      </Item363>
-      <Item364>
+      </Item362>
+      <Item363>
         <Filename Value="..\..\Crypto\Parameters\ClpDHKeyGenerationParameters.pas"/>
         <UnitName Value="ClpDHKeyGenerationParameters"/>
-      </Item364>
-      <Item365>
+      </Item363>
+      <Item364>
         <Filename Value="..\..\Crypto\Parameters\ClpDHKeyParameters.pas"/>
         <UnitName Value="ClpDHKeyParameters"/>
-      </Item365>
-      <Item366>
+      </Item364>
+      <Item365>
         <Filename Value="..\..\Crypto\Parameters\ClpDHValidationParameters.pas"/>
         <UnitName Value="ClpDHValidationParameters"/>
-      </Item366>
-      <Item367>
+      </Item365>
+      <Item366>
         <Filename Value="..\..\Crypto\Parameters\ClpDHParameters.pas"/>
         <UnitName Value="ClpDHParameters"/>
-      </Item367>
-      <Item368>
+      </Item366>
+      <Item367>
         <Filename Value="..\..\Asn1\X9\ClpDHDomainParameters.pas"/>
         <UnitName Value="ClpDHDomainParameters"/>
-      </Item368>
-      <Item369>
+      </Item367>
+      <Item368>
         <Filename Value="..\..\Asn1\X9\ClpDHValidationParams.pas"/>
         <UnitName Value="ClpDHValidationParams"/>
-      </Item369>
-      <Item370>
+      </Item368>
+      <Item369>
         <Filename Value="..\..\Utils\Randoms\ClpAESPRNGRandom.pas"/>
         <UnitName Value="ClpAESPRNGRandom"/>
-      </Item370>
-      <Item371>
+      </Item369>
+      <Item370>
         <Filename Value="..\..\Asn1\CryptLib\ClpCryptLibObjectIdentifiers.pas"/>
         <UnitName Value="ClpCryptLibObjectIdentifiers"/>
+      </Item370>
+      <Item371>
+        <Filename Value="..\..\Interfaces\ClpIEndoPreCompInfo.pas"/>
+        <UnitName Value="ClpIEndoPreCompInfo"/>
       </Item371>
+      <Item372>
+        <Filename Value="..\..\Math\EC\Endo\ClpEndoPreCompInfo.pas"/>
+        <UnitName Value="ClpEndoPreCompInfo"/>
+      </Item372>
     </Files>
     <RequiredPkgs Count="3">
       <Item1>

+ 15 - 15
CryptoLib/src/Packages/FPC/CryptoLib4PascalPackage.pas

@@ -38,20 +38,19 @@ uses
   ClpIZTauElement, ClpBigInteger, ClpECAlgorithms, ClpLongArray, 
   ClpScaleXPointMap, ClpSimpleBigDecimal, ClpTnaf, ClpZTauElement, 
   ClpGlvTypeBEndomorphism, ClpGlvTypeBParameters, ClpAbstractECMultiplier, 
-  ClpFixedPointCombMultiplier, ClpFixedPointPreCompInfo, 
-  ClpFixedPointUtilities, ClpGlvMultiplier, ClpWNafL2RMultiplier, 
-  ClpWNafPreCompInfo, ClpWTauNafMultiplier, ClpWTauNafPreCompInfo, 
-  ClpFiniteFields, ClpGenericPolynomialExtensionField, ClpGF2Polynomial, 
-  ClpPrimeField, ClpMod, ClpNat, ClpDigestUtilities, ClpRandom, 
-  ClpSecureRandom, ClpSignerUtilities, ClpArrayUtils, ClpBigIntegers, 
-  ClpBitConverter, ClpBits, ClpConverters, ClpCryptoLibTypes, ClpTimes, 
-  ClpOSRandom, ClpRandomNumberGenerator, ClpSetWeakRef, ClpParameterUtilities, 
-  ClpGeneratorUtilities, ClpCipherUtilities, ClpIAesEngine, 
-  ClpIParametersWithIV, ClpIPaddedBufferedBlockCipher, ClpIKeyParameter, 
-  ClpIBufferedCipherBase, ClpIBufferedCipher, ClpIBufferedBlockCipher, 
-  ClpIBlockCipherPadding, ClpIBlockCipher, ClpPaddedBufferedBlockCipher, 
-  ClpParametersWithIV, ClpKeyParameter, ClpBufferedBlockCipher, 
-  ClpBufferedCipherBase, ClpCheck, ClpAesEngine, 
+  ClpFixedPointCombMultiplier, ClpFixedPointPreCompInfo, ClpGlvMultiplier, 
+  ClpWNafL2RMultiplier, ClpWNafPreCompInfo, ClpWTauNafMultiplier, 
+  ClpWTauNafPreCompInfo, ClpFiniteFields, ClpGenericPolynomialExtensionField, 
+  ClpGF2Polynomial, ClpPrimeField, ClpMod, ClpNat, ClpDigestUtilities, 
+  ClpRandom, ClpSecureRandom, ClpSignerUtilities, ClpArrayUtils, 
+  ClpBigIntegers, ClpBitConverter, ClpBits, ClpConverters, ClpCryptoLibTypes, 
+  ClpTimes, ClpOSRandom, ClpRandomNumberGenerator, ClpSetWeakRef, 
+  ClpParameterUtilities, ClpGeneratorUtilities, ClpCipherUtilities, 
+  ClpIAesEngine, ClpIParametersWithIV, ClpIPaddedBufferedBlockCipher, 
+  ClpIKeyParameter, ClpIBufferedCipherBase, ClpIBufferedCipher, 
+  ClpIBufferedBlockCipher, ClpIBlockCipherPadding, ClpIBlockCipher, 
+  ClpPaddedBufferedBlockCipher, ClpParametersWithIV, ClpKeyParameter, 
+  ClpBufferedBlockCipher, ClpBufferedCipherBase, ClpCheck, ClpAesEngine, 
   ClpPascalCoinECIESKdfBytesGenerator, ClpPascalCoinIESEngine, 
   ClpBaseKdfBytesGenerator, ClpIESEngine, ClpECIESPublicKeyParser, 
   ClpIESCipher, ClpECDHBasicAgreement, ClpEphemeralKeyPair, ClpKeyEncoder, 
@@ -133,7 +132,8 @@ uses
   ClpDHKeyGeneratorHelper, ClpDHParametersHelper, ClpDHPrivateKeyParameters, 
   ClpDHPublicKeyParameters, ClpDHKeyGenerationParameters, ClpDHKeyParameters, 
   ClpDHValidationParameters, ClpDHParameters, ClpDHDomainParameters, 
-  ClpDHValidationParams, ClpAESPRNGRandom, ClpCryptLibObjectIdentifiers;
+  ClpDHValidationParams, ClpAESPRNGRandom, ClpCryptLibObjectIdentifiers, 
+  ClpIEndoPreCompInfo, ClpEndoPreCompInfo;
 
 implementation