Browse Source

Nat related fixes

Ugochukwu Mmaduekwe 1 week ago
parent
commit
086a328401

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

@@ -418,6 +418,7 @@ uses
   ClpSecT283Custom in '..\..\CryptoLib\src\Math\EC\Custom\Sec\ClpSecT283Custom.pas',
   ClpSecureRandom in '..\..\CryptoLib\src\Crypto\Randoms\ClpSecureRandom.pas',
   ClpSetWeakRef in '..\..\CryptoLib\src\GeneralUtilities\ClpSetWeakRef.pas',
+  ClpWeakRef in '..\..\CryptoLib\src\GeneralUtilities\ClpWeakRef.pas',
   ClpSignersEncodings in '..\..\CryptoLib\src\Crypto\Signers\SignerEncodings\ClpSignersEncodings.pas',
   ClpSignerSink in '..\..\CryptoLib\src\Crypto\IO\ClpSignerSink.pas',
   ClpSignerUtilities in '..\..\CryptoLib\src\Crypto\Signers\ClpSignerUtilities.pas',

+ 84 - 0
CryptoLib/src/GeneralUtilities/ClpWeakRef.pas

@@ -0,0 +1,84 @@
+{ *********************************************************************************** }
+{ *                              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 ClpWeakRef;
+
+{$I ..\Include\CryptoLib.inc}
+
+interface
+
+type
+  TWeakRef<T: IInterface> = record
+  private
+    FTarget: Pointer;
+    function GetTarget: T; inline;
+  public
+    procedure Assign(const AValue: T); inline;
+    procedure Clear; inline;
+    function TryGetTarget(out target: T): Boolean; inline;
+    function IsAlive: Boolean; inline;
+
+    property Target: T read GetTarget;
+
+    class operator Implicit(const AValue: T): TWeakRef<T>;
+    class operator Implicit(const A: TWeakRef<T>): T;
+  end;
+
+implementation
+
+{ TWeakRef<T> }
+
+procedure TWeakRef<T>.Clear;
+begin
+  //FTarget := nil;
+end;
+
+procedure TWeakRef<T>.Assign(const AValue: T);
+begin
+  FTarget := Pointer(IInterface(AValue));
+end;
+
+function TWeakRef<T>.GetTarget: T;
+begin
+  Result := T(IInterface(FTarget));
+end;
+
+function TWeakRef<T>.TryGetTarget(out target: T): Boolean;
+begin
+  Result := FTarget <> nil;
+  if Result then
+    target := T(IInterface(FTarget))
+  else
+    target := Default(T);
+end;
+
+function TWeakRef<T>.IsAlive: Boolean;
+begin
+  Result := FTarget <> nil;
+end;
+
+class operator TWeakRef<T>.Implicit(const AValue: T): TWeakRef<T>;
+begin
+  Result.FTarget := Pointer(IInterface(AValue));
+end;
+
+class operator TWeakRef<T>.Implicit(const A: TWeakRef<T>): T;
+begin
+  Result := A.GetTarget;
+end;
+
+end.

+ 13 - 19
CryptoLib/src/Math/EC/ClpECC.pas

@@ -39,7 +39,7 @@ uses
   ClpLongArray,
   ClpMultipliers,
   ClpFiniteFields,
-  ClpSetWeakRef,
+  ClpWeakRef,
   ClpECCurveConstants,
   ClpTnaf,
   ClpValidityPreCompInfo,
@@ -1134,7 +1134,7 @@ type
   var
     Fm_zs: TCryptoLibGenericArray<IECFieldElement>;
     Fm_withCompression: Boolean;
-    Fm_curve: IECCurve;
+    Fm_curve: TWeakRef<IECCurve>;
 
     Fm_x, Fm_y: IECFieldElement;
 
@@ -2219,19 +2219,8 @@ begin
 end;
 
 function TFpFieldElement.ModInverse(const x: TBigInteger): TBigInteger;
-var
-  bits, len: Int32;
-  P, n, z: TCryptoLibUInt32Array;
 begin
-  bits := FieldSize;
-  len := TBitUtilities.Asr32((bits + 31), 5);
-  P := TNat.FromBigInteger(bits, Q);
-  n := TNat.FromBigInteger(bits, x);
-  z := TNat.Create(len);
-
-  TMod.Invert(P, n, z);
-
-  result := TNat.ToBigInteger(len, z);
+  Result := TBigIntegers.ModOddInverse(Q, x);
 end;
 
 function TFpFieldElement.ModMult(const x1, x2: TBigInteger): TBigInteger;
@@ -4124,7 +4113,7 @@ constructor TECPoint.Create(const curve: IECCurve; const x, y: IECFieldElement;
   const zs: TCryptoLibGenericArray<IECFieldElement>; withCompression: Boolean);
 begin
   Inherited Create();
-  TSetWeakRef.SetWeakReference(@Fm_curve, curve);
+  Fm_curve := curve;
   Fm_x := x;
   Fm_y := y;
   Fm_zs := zs;
@@ -4141,7 +4130,7 @@ destructor TECPoint.Destroy;
 var
   Key: string;
 begin
-  TSetWeakRef.SetWeakReference(@Fm_curve, nil);
+  Fm_curve.Clear;
 
   if Assigned(Fm_preCompTable) then
   begin
@@ -4448,15 +4437,18 @@ begin
 end;
 
 function TECPoint.GetCurveCoordinateSystem: Int32;
+var
+ curve: IECCurve;
 begin
   // Cope with null curve, most commonly used by implicitlyCa
-  if Fm_curve = Nil then
+  curve := Fm_curve;
+  if curve = Nil then
   begin
     result := TECCurveConstants.COORD_AFFINE;
   end
   else
   begin
-    result := Fm_curve.CoordinateSystem;
+    result := curve.CoordinateSystem;
   end;
 end;
 
@@ -4468,9 +4460,11 @@ end;
 function TECPoint.Clone: IECPoint;
 var
  baseNorm: IECPoint;
+ curve: IECCurve;
 begin
+  curve := Fm_curve;
   baseNorm := Self.Normalize();
-  Result := Fm_curve.CreatePoint(
+  Result := curve.CreatePoint(
           baseNorm.XCoord.ToBigInteger,
           baseNorm.YCoord.ToBigInteger,
           baseNorm.IsCompressed

+ 5 - 5
CryptoLib/src/Math/EC/Custom/Djb/ClpCurve25519Custom.pas

@@ -443,10 +443,10 @@ class function TCurve25519Field.FromBigInteger(const x: TBigInteger)
 var
   z: TCryptoLibUInt32Array;
 begin
-  z := TNat256.FromBigInteger(x);
+  z := TNat.FromBigInteger(256, x);
   while (TNat256.Gte(z, P)) do
   begin
-    TNat256.SubFrom(P, z);
+    TNat256.SubFrom(P, z, 0);
   end;
   result := z;
 end;
@@ -674,7 +674,7 @@ var
   z: TCryptoLibUInt32Array;
 begin
   z := TNat256.Create();
-  TMod.Invert(TCurve25519Field.P, Fx, z);
+  TMod.CheckedModOddInverse(TCurve25519Field.P, Fx, z);
   result := TCurve25519FieldElement.Create(z);
 end;
 
@@ -839,7 +839,7 @@ var
   z: TCryptoLibUInt32Array;
 begin
   z := TNat256.Create();
-  TMod.Invert(TCurve25519Field.P, (b as ICurve25519FieldElement).x, z);
+  TMod.CheckedModOddInverse(TCurve25519Field.P, (b as ICurve25519FieldElement).x, z);
   TCurve25519Field.Multiply(z, Fx, z);
   result := TCurve25519FieldElement.Create(z);
 end;
@@ -929,7 +929,7 @@ begin
   M := TNat256.Create();
   TCurve25519Field.Square(x1.x, M);
   c := TNat256.AddBothTo(M, M, M);
-  c := c + TNat256.AddTo(W1.x, M);
+  c := c + TNat256.AddTo(W1.x, M, 0);
   TCurve25519Field.Reduce27(c, M);
 
   _2Y1 := TNat256.Create();

+ 4 - 4
CryptoLib/src/Math/EC/Custom/Sec/ClpSecP256K1Custom.pas

@@ -343,10 +343,10 @@ class function TSecP256K1Field.FromBigInteger(const x: TBigInteger)
 var
   z: TCryptoLibUInt32Array;
 begin
-  z := TNat256.FromBigInteger(x);
+  z := TNat.FromBigInteger(256, x);
   if ((z[7] = P7) and (TNat256.Gte(z, FP))) then
   begin
-    TNat256.SubFrom(FP, z);
+    TNat256.SubFrom(FP, z, 0);
   end;
   result := z;
 end;
@@ -563,7 +563,7 @@ var
   z: TCryptoLibUInt32Array;
 begin
   z := TNat256.Create();
-  TMod.Invert(TSecP256K1Field.P, Fx, z);
+  TMod.CheckedModOddInverse(TSecP256K1Field.P, Fx, z);
   result := TSecP256K1FieldElement.Create(z);
 end;
 
@@ -715,7 +715,7 @@ var
   z: TCryptoLibUInt32Array;
 begin
   z := TNat256.Create();
-  TMod.Invert(TSecP256K1Field.P, (b as ISecP256K1FieldElement).x, z);
+  TMod.CheckedModOddInverse(TSecP256K1Field.P, (b as ISecP256K1FieldElement).x, z);
   TSecP256K1Field.Multiply(z, Fx, z);
   result := TSecP256K1FieldElement.Create(z);
 end;

+ 4 - 4
CryptoLib/src/Math/EC/Custom/Sec/ClpSecP256R1Custom.pas

@@ -374,10 +374,10 @@ class function TSecP256R1Field.FromBigInteger(const x: TBigInteger)
 var
   z: TCryptoLibUInt32Array;
 begin
-  z := TNat256.FromBigInteger(x);
+  z := TNat.FromBigInteger(256, x);
   if ((z[7] = P7) and (TNat256.Gte(z, FP))) then
   begin
-    TNat256.SubFrom(FP, z);
+    TNat256.SubFrom(FP, z, 0);
   end;
   result := z;
 end;
@@ -713,7 +713,7 @@ var
   z: TCryptoLibUInt32Array;
 begin
   z := TNat256.Create();
-  TMod.Invert(TSecP256R1Field.P, Fx, z);
+  TMod.CheckedModOddInverse(TSecP256R1Field.P, Fx, z);
   result := TSecP256R1FieldElement.Create(z);
 end;
 
@@ -839,7 +839,7 @@ var
   z: TCryptoLibUInt32Array;
 begin
   z := TNat256.Create();
-  TMod.Invert(TSecP256R1Field.P, (b as ISecP256R1FieldElement).x, z);
+  TMod.CheckedModOddInverse(TSecP256R1Field.P, (b as ISecP256R1FieldElement).x, z);
   TSecP256R1Field.Multiply(z, Fx, z);
   result := TSecP256R1FieldElement.Create(z);
 end;

+ 2 - 2
CryptoLib/src/Math/EC/Custom/Sec/ClpSecP384R1Custom.pas

@@ -815,7 +815,7 @@ var
   z: TCryptoLibUInt32Array;
 begin
   z := TNat.Create(12);
-  TMod.Invert(TSecP384R1Field.P, (b as ISecP384R1FieldElement).x, z);
+  TMod.CheckedModOddInverse(TSecP384R1Field.P, (b as ISecP384R1FieldElement).x, z);
   TSecP384R1Field.Multiply(z, Fx, z);
   result := TSecP384R1FieldElement.Create(z);
 end;
@@ -843,7 +843,7 @@ var
   z: TCryptoLibUInt32Array;
 begin
   z := TNat.Create(12);
-  TMod.Invert(TSecP384R1Field.P, Fx, z);
+  TMod.CheckedModOddInverse(TSecP384R1Field.P, Fx, z);
   result := TSecP384R1FieldElement.Create(z);
 end;
 

+ 2 - 2
CryptoLib/src/Math/EC/Custom/Sec/ClpSecP521R1Custom.pas

@@ -613,7 +613,7 @@ var
   z: TCryptoLibUInt32Array;
 begin
   z := TNat.Create(17);
-  TMod.Invert(TSecP521R1Field.P, (b as ISecP521R1FieldElement).x, z);
+  TMod.CheckedModOddInverse(TSecP521R1Field.P, (b as ISecP521R1FieldElement).x, z);
   TSecP521R1Field.Multiply(z, Fx, z);
   result := TSecP521R1FieldElement.Create(z);
 end;
@@ -641,7 +641,7 @@ var
   z: TCryptoLibUInt32Array;
 begin
   z := TNat.Create(17);
-  TMod.Invert(TSecP521R1Field.P, Fx, z);
+  TMod.CheckedModOddInverse(TSecP521R1Field.P, Fx, z);
   result := TSecP521R1FieldElement.Create(z);
 end;
 

+ 4 - 14
CryptoLib/src/Math/EC/Custom/Sec/ClpSecT283Custom.pas

@@ -777,24 +777,14 @@ end;
 
 class procedure TSecT283Field.Sqrt(const x, z: TCryptoLibUInt64Array);
 var
-  u0, u1, e0, e1, e2: UInt64;
+  e0, e1, e2: UInt64;
   odd: TCryptoLibUInt64Array;
 begin
   odd := TNat320.Create64();
 
-  u0 := TInterleave.Unshuffle(x[0]);
-  u1 := TInterleave.Unshuffle(x[1]);
-  e0 := (u0 and UInt64($00000000FFFFFFFF)) or (u1 shl 32);
-  odd[0] := (u0 shr 32) or (u1 and UInt64($FFFFFFFF00000000));
-
-  u0 := TInterleave.Unshuffle(x[2]);
-  u1 := TInterleave.Unshuffle(x[3]);
-  e1 := (u0 and UInt64($00000000FFFFFFFF)) or (u1 shl 32);
-  odd[1] := (u0 shr 32) or (u1 and UInt64($FFFFFFFF00000000));
-
-  u0 := TInterleave.Unshuffle(x[4]);
-  e2 := (u0 and UInt64($00000000FFFFFFFF));
-  odd[2] := (u0 shr 32);
+  odd[0] := TInterleave.Unshuffle(x[0], x[1], e0);
+  odd[1] := TInterleave.Unshuffle(x[2], x[3], e1);
+  odd[2] := TInterleave.Unshuffle(x[4], e2);
 
   Multiply(odd, FROOT_Z, z);
 

+ 7 - 5
CryptoLib/src/Math/EC/Multiplier/ClpMultipliers.pas

@@ -38,7 +38,7 @@ uses
   ClpIMultipliers,
   ClpIWNafPreCompInfo,
   ClpECCompUtilities,
-  ClpSetWeakRef,
+  ClpWeakRef,
   ClpCryptoLibTypes;
 
 resourcestring
@@ -83,7 +83,7 @@ type
 
   strict protected
   var
-    Fcurve: IECCurve;
+    Fcurve: TWeakRef<IECCurve>;
     FglvEndomorphism: IGlvEndomorphism;
 
     function MultiplyPositive(const p: IECPoint; const k: TBigInteger)
@@ -329,13 +329,13 @@ begin
     raise EArgumentCryptoLibException.CreateRes(@SCurveUnknownGroupOrder);
   end;
 
-  TSetWeakRef.SetWeakReference(@Fcurve, curve);
+  Fcurve := curve;
   FglvEndomorphism := glvEndomorphism;
 end;
 
 destructor TGlvMultiplier.Destroy;
 begin
-  TSetWeakRef.SetWeakReference(@Fcurve, Nil);
+  //TSetWeakRef.SetWeakReference(@Fcurve, Nil);
   inherited Destroy;
 end;
 
@@ -345,8 +345,10 @@ var
   n, a, b: TBigInteger;
   ab: TCryptoLibGenericArray<TBigInteger>;
   q: IECPoint;
+  LCurve: IECCurve;
 begin
-  if (not(Fcurve.Equals(p.curve))) then
+  LCurve :=  Fcurve;
+  if (not(LCurve.Equals(p.curve))) then
   begin
     raise EInvalidOperationCryptoLibException.Create('');
   end;

+ 92 - 92
CryptoLib/src/Math/Raw/ClpNat.pas

@@ -1262,10 +1262,10 @@ begin
   {$IFDEF DEBUG}
   System.Assert(AZPos <= (ALen - 3));
   {$ENDIF}
-  LC := LC + (LXVal * UInt32(AY + AZ[AZPos + 0]));
+  LC := LC + (LXVal * UInt32(AY) + AZ[AZPos + 0]);
   AZ[AZPos + 0] := UInt32(LC);
   LC := LC shr 32;
-  LC := LC + (LXVal * ((AY shr 32)) + AZ[AZPos + 1]);
+  LC := LC + (LXVal * (AY shr 32) + AZ[AZPos + 1]);
   AZ[AZPos + 1] := UInt32(LC);
   LC := LC shr 32;
   LC := LC + (AZ[AZPos + 2]);
@@ -1441,14 +1441,14 @@ var
   LI: Int32;
   LNext: UInt64;
 begin
-  LI := ALen;
-  LNext := AZ[AZOff + LI];
   {$IFDEF DEBUG}
   System.Assert((ABits > 0) and (ABits < 64));
   {$ENDIF}
-  System.Dec(LI);
-  while LI >= 0 do
+  LI := ALen;
+  while LI > 0 do
   begin
+    System.Dec(LI);
+    LNext := AZ[AZOff + LI];
     AZ[AZOff + LI] := ((LNext shr ABits)) or (TBitUtilities.NegativeLeftShift32(AC, -ABits));
     AC := LNext;
   end;
@@ -1483,13 +1483,12 @@ var
 begin
   LI := 0;
   LLimit4 := ALen - 4;
-  LNext0 := AZ[LI + 0];
-  LNext1 := AZ[LI + 1];
-  LNext2 := AZ[LI + 2];
-  LNext3 := AZ[LI + 3];
-  LNext := AZ[LI];
   while LI <= LLimit4 do
   begin
+    LNext0 := AZ[LI + 0];
+    LNext1 := AZ[LI + 1];
+    LNext2 := AZ[LI + 2];
+    LNext3 := AZ[LI + 3];
     AZ[LI + 0] := ((LNext0 shl 1)) or ((AC shr 31));
     AZ[LI + 1] := ((LNext1 shl 1)) or ((LNext0 shr 31));
     AZ[LI + 2] := ((LNext2 shl 1)) or ((LNext1 shr 31));
@@ -1499,6 +1498,7 @@ begin
   end;
   while LI < ALen do
   begin
+    LNext := AZ[LI];
     AZ[LI] := ((LNext shl 1)) or ((AC shr 31));
     AC := LNext;
     System.Inc(LI);
@@ -1518,13 +1518,12 @@ var
 begin
   LI := 0;
   LLimit4 := ALen - 4;
-  LNext0 := AZ[AZOff + LI + 0];
-  LNext1 := AZ[AZOff + LI + 1];
-  LNext2 := AZ[AZOff + LI + 2];
-  LNext3 := AZ[AZOff + LI + 3];
-  LNext := AZ[AZOff + LI];
   while LI <= LLimit4 do
   begin
+    LNext0 := AZ[AZOff + LI + 0];
+    LNext1 := AZ[AZOff + LI + 1];
+    LNext2 := AZ[AZOff + LI + 2];
+    LNext3 := AZ[AZOff + LI + 3];
     AZ[AZOff + LI + 0] := ((LNext0 shl 1)) or ((AC shr 31));
     AZ[AZOff + LI + 1] := ((LNext1 shl 1)) or ((LNext0 shr 31));
     AZ[AZOff + LI + 2] := ((LNext2 shl 1)) or ((LNext1 shr 31));
@@ -1534,6 +1533,7 @@ begin
   end;
   while LI < ALen do
   begin
+    LNext := AZ[AZOff + LI];
     AZ[AZOff + LI] := ((LNext shl 1)) or ((AC shr 31));
     AC := LNext;
     System.Inc(LI);
@@ -1553,13 +1553,12 @@ var
 begin
   LI := 0;
   LLimit4 := ALen - 4;
-  LNext0 := AX[LI + 0];
-  LNext1 := AX[LI + 1];
-  LNext2 := AX[LI + 2];
-  LNext3 := AX[LI + 3];
-  LNext := AX[LI];
   while LI <= LLimit4 do
   begin
+    LNext0 := AX[LI + 0];
+    LNext1 := AX[LI + 1];
+    LNext2 := AX[LI + 2];
+    LNext3 := AX[LI + 3];
     AZ[LI + 0] := ((LNext0 shl 1)) or ((AC shr 31));
     AZ[LI + 1] := ((LNext1 shl 1)) or ((LNext0 shr 31));
     AZ[LI + 2] := ((LNext2 shl 1)) or ((LNext1 shr 31));
@@ -1569,6 +1568,7 @@ begin
   end;
   while LI < ALen do
   begin
+    LNext := AX[LI];
     AZ[LI] := ((LNext shl 1)) or ((AC shr 31));
     AC := LNext;
     System.Inc(LI);
@@ -1588,13 +1588,12 @@ var
 begin
   LI := 0;
   LLimit4 := ALen - 4;
-  LNext0 := AX[AXOff + LI + 0];
-  LNext1 := AX[AXOff + LI + 1];
-  LNext2 := AX[AXOff + LI + 2];
-  LNext3 := AX[AXOff + LI + 3];
-  LNext := AX[AXOff + LI];
   while LI <= LLimit4 do
   begin
+    LNext0 := AX[AXOff + LI + 0];
+    LNext1 := AX[AXOff + LI + 1];
+    LNext2 := AX[AXOff + LI + 2];
+    LNext3 := AX[AXOff + LI + 3];
     AZ[AZOff + LI + 0] := ((LNext0 shl 1)) or ((AC shr 31));
     AZ[AZOff + LI + 1] := ((LNext1 shl 1)) or ((LNext0 shr 31));
     AZ[AZOff + LI + 2] := ((LNext2 shl 1)) or ((LNext1 shr 31));
@@ -1604,6 +1603,7 @@ begin
   end;
   while LI < ALen do
   begin
+    LNext := AX[AXOff + LI];
     AZ[AZOff + LI] := ((LNext shl 1)) or ((AC shr 31));
     AC := LNext;
     System.Inc(LI);
@@ -1623,13 +1623,12 @@ var
 begin
   LI := 0;
   LLimit4 := ALen - 4;
-  LNext0 := AX[LI + 0];
-  LNext1 := AX[LI + 1];
-  LNext2 := AX[LI + 2];
-  LNext3 := AX[LI + 3];
-  LNext := AX[LI];
   while LI <= LLimit4 do
   begin
+    LNext0 := AX[LI + 0];
+    LNext1 := AX[LI + 1];
+    LNext2 := AX[LI + 2];
+    LNext3 := AX[LI + 3];
     AZ[LI + 0] := ((LNext0 shl 1)) or ((AC shr 63));
     AZ[LI + 1] := ((LNext1 shl 1)) or ((LNext0 shr 63));
     AZ[LI + 2] := ((LNext2 shl 1)) or ((LNext1 shr 63));
@@ -1639,6 +1638,7 @@ begin
   end;
   while LI < ALen do
   begin
+    LNext := AX[LI];
     AZ[LI] := ((LNext shl 1)) or ((AC shr 63));
     AC := LNext;
     System.Inc(LI);
@@ -1658,13 +1658,12 @@ var
 begin
   LI := 0;
   LLimit4 := ALen - 4;
-  LNext0 := AX[AXOff + LI + 0];
-  LNext1 := AX[AXOff + LI + 1];
-  LNext2 := AX[AXOff + LI + 2];
-  LNext3 := AX[AXOff + LI + 3];
-  LNext := AX[AXOff + LI];
   while LI <= LLimit4 do
   begin
+    LNext0 := AX[AXOff + LI + 0];
+    LNext1 := AX[AXOff + LI + 1];
+    LNext2 := AX[AXOff + LI + 2];
+    LNext3 := AX[AXOff + LI + 3];
     AZ[AZOff + LI + 0] := ((LNext0 shl 1)) or ((AC shr 63));
     AZ[AZOff + LI + 1] := ((LNext1 shl 1)) or ((LNext0 shr 63));
     AZ[AZOff + LI + 2] := ((LNext2 shl 1)) or ((LNext1 shr 63));
@@ -1674,6 +1673,7 @@ begin
   end;
   while LI < ALen do
   begin
+    LNext := AX[AXOff + LI];
     AZ[AZOff + LI] := ((LNext shl 1)) or ((AC shr 63));
     AC := LNext;
     System.Inc(LI);
@@ -1693,25 +1693,25 @@ var
 begin
   LI := 0;
   LLimit4 := ALen - 4;
-  LNext0 := AZ[LI + 0];
-  LNext1 := AZ[LI + 1];
-  LNext2 := AZ[LI + 2];
-  LNext3 := AZ[LI + 3];
-  LNext := AZ[LI];
   {$IFDEF DEBUG}
   System.Assert((ABits > 0) and (ABits < 32));
   {$ENDIF}
   while LI <= LLimit4 do
   begin
+    LNext0 := AZ[LI + 0];
+    LNext1 := AZ[LI + 1];
+    LNext2 := AZ[LI + 2];
+    LNext3 := AZ[LI + 3];
     AZ[LI + 0] := ((LNext0 shl ABits)) or (TBitUtilities.NegativeRightShift32(AC, -ABits));
     AZ[LI + 1] := ((LNext1 shl ABits)) or (TBitUtilities.NegativeRightShift32(LNext0, -ABits));
     AZ[LI + 2] := ((LNext2 shl ABits)) or (TBitUtilities.NegativeRightShift32(LNext1, -ABits));
     AZ[LI + 3] := ((LNext3 shl ABits)) or (TBitUtilities.NegativeRightShift32(LNext2, -ABits));
     AC := LNext3;
-    LI := LI + (4);
+    LI := LI + 4;
   end;
   while LI < ALen do
   begin
+    LNext := AZ[LI];
     AZ[LI] := ((LNext shl ABits)) or (TBitUtilities.NegativeRightShift32(AC, -ABits));
     AC := LNext;
     System.Inc(LI);
@@ -1731,25 +1731,25 @@ var
 begin
   LI := 0;
   LLimit4 := ALen - 4;
-  LNext0 := AZ[AZOff + LI + 0];
-  LNext1 := AZ[AZOff + LI + 1];
-  LNext2 := AZ[AZOff + LI + 2];
-  LNext3 := AZ[AZOff + LI + 3];
-  LNext := AZ[AZOff + LI];
   {$IFDEF DEBUG}
   System.Assert((ABits > 0) and (ABits < 32));
   {$ENDIF}
   while LI <= LLimit4 do
   begin
+    LNext0 := AZ[AZOff + LI + 0];
+    LNext1 := AZ[AZOff + LI + 1];
+    LNext2 := AZ[AZOff + LI + 2];
+    LNext3 := AZ[AZOff + LI + 3];
     AZ[AZOff + LI + 0] := ((LNext0 shl ABits)) or (TBitUtilities.NegativeRightShift32(AC, -ABits));
     AZ[AZOff + LI + 1] := ((LNext1 shl ABits)) or (TBitUtilities.NegativeRightShift32(LNext0, -ABits));
     AZ[AZOff + LI + 2] := ((LNext2 shl ABits)) or (TBitUtilities.NegativeRightShift32(LNext1, -ABits));
     AZ[AZOff + LI + 3] := ((LNext3 shl ABits)) or (TBitUtilities.NegativeRightShift32(LNext2, -ABits));
     AC := LNext3;
-    LI := LI + (4);
+    LI := LI + 4;
   end;
   while LI < ALen do
   begin
+    LNext := AZ[AZOff + LI];
     AZ[AZOff + LI] := ((LNext shl ABits)) or (TBitUtilities.NegativeRightShift32(AC, -ABits));
     AC := LNext;
     System.Inc(LI);
@@ -1769,25 +1769,25 @@ var
 begin
   LI := 0;
   LLimit4 := ALen - 4;
-  LNext0 := AX[LI + 0];
-  LNext1 := AX[LI + 1];
-  LNext2 := AX[LI + 2];
-  LNext3 := AX[LI + 3];
-  LNext := AX[LI];
   {$IFDEF DEBUG}
   System.Assert((ABits > 0) and (ABits < 32));
   {$ENDIF}
   while LI <= LLimit4 do
   begin
+    LNext0 := AX[LI + 0];
+    LNext1 := AX[LI + 1];
+    LNext2 := AX[LI + 2];
+    LNext3 := AX[LI + 3];
     AZ[LI + 0] := ((LNext0 shl ABits)) or (TBitUtilities.NegativeRightShift32(AC, -ABits));
     AZ[LI + 1] := ((LNext1 shl ABits)) or (TBitUtilities.NegativeRightShift32(LNext0, -ABits));
     AZ[LI + 2] := ((LNext2 shl ABits)) or (TBitUtilities.NegativeRightShift32(LNext1, -ABits));
     AZ[LI + 3] := ((LNext3 shl ABits)) or (TBitUtilities.NegativeRightShift32(LNext2, -ABits));
     AC := LNext3;
-    LI := LI + (4);
+    LI := LI + 4;
   end;
   while LI < ALen do
   begin
+    LNext := AX[LI];
     AZ[LI] := ((LNext shl ABits)) or (TBitUtilities.NegativeRightShift32(AC, -ABits));
     AC := LNext;
     System.Inc(LI);
@@ -1807,25 +1807,25 @@ var
 begin
   LI := 0;
   LLimit4 := ALen - 4;
-  LNext0 := AX[AXOff + LI + 0];
-  LNext1 := AX[AXOff + LI + 1];
-  LNext2 := AX[AXOff + LI + 2];
-  LNext3 := AX[AXOff + LI + 3];
-  LNext := AX[AXOff + LI];
   {$IFDEF DEBUG}
   System.Assert((ABits > 0) and (ABits < 32));
   {$ENDIF}
   while LI <= LLimit4 do
   begin
+    LNext0 := AX[AXOff + LI + 0];
+    LNext1 := AX[AXOff + LI + 1];
+    LNext2 := AX[AXOff + LI + 2];
+    LNext3 := AX[AXOff + LI + 3];
     AZ[AZOff + LI + 0] := ((LNext0 shl ABits)) or (TBitUtilities.NegativeRightShift32(AC, -ABits));
     AZ[AZOff + LI + 1] := ((LNext1 shl ABits)) or (TBitUtilities.NegativeRightShift32(LNext0, -ABits));
     AZ[AZOff + LI + 2] := ((LNext2 shl ABits)) or (TBitUtilities.NegativeRightShift32(LNext1, -ABits));
     AZ[AZOff + LI + 3] := ((LNext3 shl ABits)) or (TBitUtilities.NegativeRightShift32(LNext2, -ABits));
     AC := LNext3;
-    LI := LI + (4);
+    LI := LI + 4;
   end;
   while LI < ALen do
   begin
+    LNext := AX[AXOff + LI];
     AZ[AZOff + LI] := ((LNext shl ABits)) or (TBitUtilities.NegativeRightShift32(AC, -ABits));
     AC := LNext;
     System.Inc(LI);
@@ -1845,25 +1845,25 @@ var
 begin
   LI := 0;
   LLimit4 := ALen - 4;
-  LNext0 := AZ[LI + 0];
-  LNext1 := AZ[LI + 1];
-  LNext2 := AZ[LI + 2];
-  LNext3 := AZ[LI + 3];
-  LNext := AZ[LI];
   {$IFDEF DEBUG}
   System.Assert((ABits > 0) and (ABits < 64));
   {$ENDIF}
   while LI <= LLimit4 do
   begin
+    LNext0 := AZ[LI + 0];
+    LNext1 := AZ[LI + 1];
+    LNext2 := AZ[LI + 2];
+    LNext3 := AZ[LI + 3];
     AZ[LI + 0] := ((LNext0 shl ABits)) or (TBitUtilities.NegativeRightShift32(AC, -ABits));
     AZ[LI + 1] := ((LNext1 shl ABits)) or (TBitUtilities.NegativeRightShift32(LNext0, -ABits));
     AZ[LI + 2] := ((LNext2 shl ABits)) or (TBitUtilities.NegativeRightShift32(LNext1, -ABits));
     AZ[LI + 3] := ((LNext3 shl ABits)) or (TBitUtilities.NegativeRightShift32(LNext2, -ABits));
     AC := LNext3;
-    LI := LI + (4);
+    LI := LI + 4;
   end;
   while LI < ALen do
   begin
+    LNext := AZ[LI];
     AZ[LI] := ((LNext shl ABits)) or (TBitUtilities.NegativeRightShift32(AC, -ABits));
     AC := LNext;
     System.Inc(LI);
@@ -1883,25 +1883,25 @@ var
 begin
   LI := 0;
   LLimit4 := ALen - 4;
-  LNext0 := AZ[AZOff + LI + 0];
-  LNext1 := AZ[AZOff + LI + 1];
-  LNext2 := AZ[AZOff + LI + 2];
-  LNext3 := AZ[AZOff + LI + 3];
-  LNext := AZ[AZOff + LI];
   {$IFDEF DEBUG}
   System.Assert((ABits > 0) and (ABits < 64));
   {$ENDIF}
   while LI <= LLimit4 do
   begin
+    LNext0 := AZ[AZOff + LI + 0];
+    LNext1 := AZ[AZOff + LI + 1];
+    LNext2 := AZ[AZOff + LI + 2];
+    LNext3 := AZ[AZOff + LI + 3];
     AZ[AZOff + LI + 0] := ((LNext0 shl ABits)) or (TBitUtilities.NegativeRightShift32(AC, -ABits));
     AZ[AZOff + LI + 1] := ((LNext1 shl ABits)) or (TBitUtilities.NegativeRightShift32(LNext0, -ABits));
     AZ[AZOff + LI + 2] := ((LNext2 shl ABits)) or (TBitUtilities.NegativeRightShift32(LNext1, -ABits));
     AZ[AZOff + LI + 3] := ((LNext3 shl ABits)) or (TBitUtilities.NegativeRightShift32(LNext2, -ABits));
     AC := LNext3;
-    LI := LI + (4);
+    LI := LI + 4;
   end;
   while LI < ALen do
   begin
+    LNext := AZ[AZOff + LI];
     AZ[AZOff + LI] := ((LNext shl ABits)) or (TBitUtilities.NegativeRightShift32(AC, -ABits));
     AC := LNext;
     System.Inc(LI);
@@ -1921,25 +1921,25 @@ var
 begin
   LI := 0;
   LLimit4 := ALen - 4;
-  LNext0 := AX[LI + 0];
-  LNext1 := AX[LI + 1];
-  LNext2 := AX[LI + 2];
-  LNext3 := AX[LI + 3];
-  LNext := AX[LI];
   {$IFDEF DEBUG}
   System.Assert((ABits > 0) and (ABits < 64));
   {$ENDIF}
   while LI <= LLimit4 do
   begin
+    LNext0 := AX[LI + 0];
+    LNext1 := AX[LI + 1];
+    LNext2 := AX[LI + 2];
+    LNext3 := AX[LI + 3];
     AZ[LI + 0] := ((LNext0 shl ABits)) or (TBitUtilities.NegativeRightShift32(AC, -ABits));
     AZ[LI + 1] := ((LNext1 shl ABits)) or (TBitUtilities.NegativeRightShift32(LNext0, -ABits));
     AZ[LI + 2] := ((LNext2 shl ABits)) or (TBitUtilities.NegativeRightShift32(LNext1, -ABits));
     AZ[LI + 3] := ((LNext3 shl ABits)) or (TBitUtilities.NegativeRightShift32(LNext2, -ABits));
     AC := LNext3;
-    LI := LI + (4);
+    LI := LI + 4;
   end;
   while LI < ALen do
   begin
+    LNext := AX[LI];
     AZ[LI] := ((LNext shl ABits)) or (TBitUtilities.NegativeRightShift32(AC, -ABits));
     AC := LNext;
     System.Inc(LI);
@@ -1959,25 +1959,25 @@ var
 begin
   LI := 0;
   LLimit4 := ALen - 4;
-  LNext0 := AX[AXOff + LI + 0];
-  LNext1 := AX[AXOff + LI + 1];
-  LNext2 := AX[AXOff + LI + 2];
-  LNext3 := AX[AXOff + LI + 3];
-  LNext := AX[AXOff + LI];
   {$IFDEF DEBUG}
   System.Assert((ABits > 0) and (ABits < 64));
   {$ENDIF}
   while LI <= LLimit4 do
   begin
+    LNext0 := AX[AXOff + LI + 0];
+    LNext1 := AX[AXOff + LI + 1];
+    LNext2 := AX[AXOff + LI + 2];
+    LNext3 := AX[AXOff + LI + 3];
     AZ[AZOff + LI + 0] := ((LNext0 shl ABits)) or (TBitUtilities.NegativeRightShift32(AC, -ABits));
     AZ[AZOff + LI + 1] := ((LNext1 shl ABits)) or (TBitUtilities.NegativeRightShift32(LNext0, -ABits));
     AZ[AZOff + LI + 2] := ((LNext2 shl ABits)) or (TBitUtilities.NegativeRightShift32(LNext1, -ABits));
     AZ[AZOff + LI + 3] := ((LNext3 shl ABits)) or (TBitUtilities.NegativeRightShift32(LNext2, -ABits));
     AC := LNext3;
-    LI := LI + (4);
+    LI := LI + 4;
   end;
   while LI < ALen do
   begin
+    LNext := AX[AXOff + LI];
     AZ[AZOff + LI] := ((LNext shl ABits)) or (TBitUtilities.NegativeRightShift32(AC, -ABits));
     AC := LNext;
     System.Inc(LI);
@@ -2288,13 +2288,13 @@ class function TNat.SubDWordAt(ALen: Int32; AX: UInt64; AZ: TCryptoLibUInt32Arra
 var
   LC: Int64;
 begin
-  LC := AZ[AZPos + 0] - Int64((AX ) and M);
+  LC := AZ[AZPos + 0] - Int64(AX and M);
   {$IFDEF DEBUG}
   System.Assert(AZPos <= (ALen - 2));
   {$ENDIF}
   AZ[AZPos + 0] := UInt32(LC);
   LC := TBitUtilities.Asr64(LC, 32);
-  LC := LC + (AZ[AZPos + 1] - Int64(((AX ) shr 32)));
+  LC := LC + (AZ[AZPos + 1] - Int64(AX shr 32));
   AZ[AZPos + 1] := UInt32(LC);
   LC := TBitUtilities.Asr64(LC, 32);
   if (LC = 0) then
@@ -2311,13 +2311,13 @@ class function TNat.SubDWordAt(ALen: Int32; AX: UInt64; AZ: TCryptoLibUInt32Arra
 var
   LC: Int64;
 begin
-  LC := AZ[AZOff + AZPos] - Int64((AX ) and M);
+  LC := AZ[AZOff + AZPos] - Int64(AX and M);
   {$IFDEF DEBUG}
   System.Assert(AZPos <= (ALen - 2));
   {$ENDIF}
   AZ[AZOff + AZPos] := UInt32(LC);
   LC := TBitUtilities.Asr64(LC, 32);
-  LC := LC + (AZ[AZOff + AZPos + 1] - Int64(((AX ) shr 32)));
+  LC := LC + (AZ[AZOff + AZPos + 1] - Int64(AX shr 32));
   AZ[AZOff + AZPos + 1] := UInt32(LC);
   LC := TBitUtilities.Asr64(LC, 32);
   if (LC = 0) then
@@ -2334,10 +2334,10 @@ class function TNat.SubDWordFrom(ALen: Int32; AX: UInt64; AZ: TCryptoLibUInt32Ar
 var
   LC: Int64;
 begin
-  LC := AZ[0] - Int64((AX ) and M);
+  LC := AZ[0] - Int64(AX and M);
   AZ[0] := UInt32(LC);
   LC := TBitUtilities.Asr64(LC, 32);
-  LC := LC + (AZ[1] - Int64(((AX ) shr 32)));
+  LC := LC + (AZ[1] - Int64(AX shr 32));
   AZ[1] := UInt32(LC);
   LC := TBitUtilities.Asr64(LC, 32);
   if (LC = 0) then
@@ -2354,10 +2354,10 @@ class function TNat.SubDWordFrom(ALen: Int32; AX: UInt64; AZ: TCryptoLibUInt32Ar
 var
   LC: Int64;
 begin
-  LC := AZ[AZOff + 0] - Int64((AX ) and M);
+  LC := AZ[AZOff + 0] - Int64(AX and M);
   AZ[AZOff + 0] := UInt32(LC);
   LC := TBitUtilities.Asr64(LC, 32);
-  LC := LC + (AZ[AZOff + 1] - Int64(((AX ) shr 32)));
+  LC := LC + (AZ[AZOff + 1] - Int64(AX shr 32));
   AZ[AZOff + 1] := UInt32(LC);
   LC := TBitUtilities.Asr64(LC, 32);
   if (LC = 0) then

+ 40 - 40
CryptoLib/src/Math/Raw/ClpNat256.pas

@@ -1542,28 +1542,28 @@ begin
   LC := 0;
   LC := LC + (Int64(AX[0]) - AY[0]);
   AZ[0] := UInt32(LC);
-  LC := LC shr 32;
+  LC := TBitUtilities.Asr64(LC, 32);
   LC := LC + (Int64(AX[1]) - AY[1]);
   AZ[1] := UInt32(LC);
-  LC := LC shr 32;
+  LC := TBitUtilities.Asr64(LC, 32);
   LC := LC + (Int64(AX[2]) - AY[2]);
   AZ[2] := UInt32(LC);
-  LC := LC shr 32;
+  LC := TBitUtilities.Asr64(LC, 32);
   LC := LC + (Int64(AX[3]) - AY[3]);
   AZ[3] := UInt32(LC);
-  LC := LC shr 32;
+  LC := TBitUtilities.Asr64(LC, 32);
   LC := LC + (Int64(AX[4]) - AY[4]);
   AZ[4] := UInt32(LC);
-  LC := LC shr 32;
+  LC := TBitUtilities.Asr64(LC, 32);
   LC := LC + (Int64(AX[5]) - AY[5]);
   AZ[5] := UInt32(LC);
-  LC := LC shr 32;
+  LC := TBitUtilities.Asr64(LC, 32);
   LC := LC + (Int64(AX[6]) - AY[6]);
   AZ[6] := UInt32(LC);
-  LC := LC shr 32;
+  LC := TBitUtilities.Asr64(LC, 32);
   LC := LC + (Int64(AX[7]) - AY[7]);
   AZ[7] := UInt32(LC);
-  LC := LC shr 32;
+  LC := TBitUtilities.Asr64(LC, 32);
   Result := Int32(LC);
 end;
 
@@ -1574,28 +1574,28 @@ begin
   LC := 0;
   LC := LC + (Int64(AX[AXOff + 0]) - AY[AYOff + 0]);
   AZ[AZOff + 0] := UInt32(LC);
-  LC := LC shr 32;
+  LC := TBitUtilities.Asr64(LC, 32);
   LC := LC + (Int64(AX[AXOff + 1]) - AY[AYOff + 1]);
   AZ[AZOff + 1] := UInt32(LC);
-  LC := LC shr 32;
+  LC := TBitUtilities.Asr64(LC, 32);
   LC := LC + (Int64(AX[AXOff + 2]) - AY[AYOff + 2]);
   AZ[AZOff + 2] := UInt32(LC);
-  LC := LC shr 32;
+  LC := TBitUtilities.Asr64(LC, 32);
   LC := LC + (Int64(AX[AXOff + 3]) - AY[AYOff + 3]);
   AZ[AZOff + 3] := UInt32(LC);
-  LC := LC shr 32;
+  LC := TBitUtilities.Asr64(LC, 32);
   LC := LC + (Int64(AX[AXOff + 4]) - AY[AYOff + 4]);
   AZ[AZOff + 4] := UInt32(LC);
-  LC := LC shr 32;
+  LC := TBitUtilities.Asr64(LC, 32);
   LC := LC + (Int64(AX[AXOff + 5]) - AY[AYOff + 5]);
   AZ[AZOff + 5] := UInt32(LC);
-  LC := LC shr 32;
+  LC := TBitUtilities.Asr64(LC, 32);
   LC := LC + (Int64(AX[AXOff + 6]) - AY[AYOff + 6]);
   AZ[AZOff + 6] := UInt32(LC);
-  LC := LC shr 32;
+  LC := TBitUtilities.Asr64(LC, 32);
   LC := LC + (Int64(AX[AXOff + 7]) - AY[AYOff + 7]);
   AZ[AZOff + 7] := UInt32(LC);
-  LC := LC shr 32;
+  LC := TBitUtilities.Asr64(LC, 32);
   Result := Int32(LC);
 end;
 
@@ -1606,28 +1606,28 @@ begin
   LC := 0;
   LC := LC + (Int64(AZ[0]) - AX[0] - AY[0]);
   AZ[0] := UInt32(LC);
-  LC := LC shr 32;
+  LC := TBitUtilities.Asr64(LC, 32);
   LC := LC + (Int64(AZ[1]) - AX[1] - AY[1]);
   AZ[1] := UInt32(LC);
-  LC := LC shr 32;
+  LC := TBitUtilities.Asr64(LC, 32);
   LC := LC + (Int64(AZ[2]) - AX[2] - AY[2]);
   AZ[2] := UInt32(LC);
-  LC := LC shr 32;
+  LC := TBitUtilities.Asr64(LC, 32);
   LC := LC + (Int64(AZ[3]) - AX[3] - AY[3]);
   AZ[3] := UInt32(LC);
-  LC := LC shr 32;
+  LC := TBitUtilities.Asr64(LC, 32);
   LC := LC + (Int64(AZ[4]) - AX[4] - AY[4]);
   AZ[4] := UInt32(LC);
-  LC := LC shr 32;
+  LC := TBitUtilities.Asr64(LC, 32);
   LC := LC + (Int64(AZ[5]) - AX[5] - AY[5]);
   AZ[5] := UInt32(LC);
-  LC := LC shr 32;
+  LC := TBitUtilities.Asr64(LC, 32);
   LC := LC + (Int64(AZ[6]) - AX[6] - AY[6]);
   AZ[6] := UInt32(LC);
-  LC := LC shr 32;
+  LC := TBitUtilities.Asr64(LC, 32);
   LC := LC + (Int64(AZ[7]) - AX[7] - AY[7]);
   AZ[7] := UInt32(LC);
-  LC := LC shr 32;
+  LC := TBitUtilities.Asr64(LC, 32);
   Result := Int32(LC);
 end;
 
@@ -1638,28 +1638,28 @@ begin
   LC := ACIn;
   LC := LC + (Int64(AZ[0]) - AX[0]);
   AZ[0] := UInt32(LC);
-  LC := LC shr 32;
+  LC := TBitUtilities.Asr64(LC, 32);
   LC := LC + (Int64(AZ[1]) - AX[1]);
   AZ[1] := UInt32(LC);
-  LC := LC shr 32;
+  LC := TBitUtilities.Asr64(LC, 32);
   LC := LC + (Int64(AZ[2]) - AX[2]);
   AZ[2] := UInt32(LC);
-  LC := LC shr 32;
+  LC := TBitUtilities.Asr64(LC, 32);
   LC := LC + (Int64(AZ[3]) - AX[3]);
   AZ[3] := UInt32(LC);
-  LC := LC shr 32;
+  LC := TBitUtilities.Asr64(LC, 32);
   LC := LC + (Int64(AZ[4]) - AX[4]);
   AZ[4] := UInt32(LC);
-  LC := LC shr 32;
+  LC := TBitUtilities.Asr64(LC, 32);
   LC := LC + (Int64(AZ[5]) - AX[5]);
   AZ[5] := UInt32(LC);
-  LC := LC shr 32;
+  LC := TBitUtilities.Asr64(LC, 32);
   LC := LC + (Int64(AZ[6]) - AX[6]);
   AZ[6] := UInt32(LC);
-  LC := LC shr 32;
+  LC := TBitUtilities.Asr64(LC, 32);
   LC := LC + (Int64(AZ[7]) - AX[7]);
   AZ[7] := UInt32(LC);
-  LC := LC shr 32;
+  LC := TBitUtilities.Asr64(LC, 32);
   Result := Int32(LC);
 end;
 
@@ -1670,28 +1670,28 @@ begin
   LC := ACIn;
   LC := LC + (Int64(AZ[AZOff + 0]) - AX[AXOff + 0]);
   AZ[AZOff + 0] := UInt32(LC);
-  LC := LC shr 32;
+  LC := TBitUtilities.Asr64(LC, 32);
   LC := LC + (Int64(AZ[AZOff + 1]) - AX[AXOff + 1]);
   AZ[AZOff + 1] := UInt32(LC);
-  LC := LC shr 32;
+  LC := TBitUtilities.Asr64(LC, 32);
   LC := LC + (Int64(AZ[AZOff + 2]) - AX[AXOff + 2]);
   AZ[AZOff + 2] := UInt32(LC);
-  LC := LC shr 32;
+  LC := TBitUtilities.Asr64(LC, 32);
   LC := LC + (Int64(AZ[AZOff + 3]) - AX[AXOff + 3]);
   AZ[AZOff + 3] := UInt32(LC);
-  LC := LC shr 32;
+  LC := TBitUtilities.Asr64(LC, 32);
   LC := LC + (Int64(AZ[AZOff + 4]) - AX[AXOff + 4]);
   AZ[AZOff + 4] := UInt32(LC);
-  LC := LC shr 32;
+  LC := TBitUtilities.Asr64(LC, 32);
   LC := LC + (Int64(AZ[AZOff + 5]) - AX[AXOff + 5]);
   AZ[AZOff + 5] := UInt32(LC);
-  LC := LC shr 32;
+  LC := TBitUtilities.Asr64(LC, 32);
   LC := LC + (Int64(AZ[AZOff + 6]) - AX[AXOff + 6]);
   AZ[AZOff + 6] := UInt32(LC);
-  LC := LC shr 32;
+  LC := TBitUtilities.Asr64(LC, 32);
   LC := LC + (Int64(AZ[AZOff + 7]) - AX[AXOff + 7]);
   AZ[AZOff + 7] := UInt32(LC);
-  LC := LC shr 32;
+  LC := TBitUtilities.Asr64(LC, 32);
   Result := Int32(LC);
 end;