Browse Source

refactoring of ECSchnorr interface

Ugochukwu Mmaduekwe 7 years ago
parent
commit
3d7ae667b2

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

@@ -363,7 +363,16 @@ uses
   ClpPbeParametersGenerator in '..\..\CryptoLib\src\Crypto\Generators\ClpPbeParametersGenerator.pas',
   ClpIPbeParametersGenerator in '..\..\CryptoLib\src\Interfaces\ClpIPbeParametersGenerator.pas',
   ClpPkcs5S2ParametersGenerator in '..\..\CryptoLib\src\Crypto\Generators\ClpPkcs5S2ParametersGenerator.pas',
-  ClpIPkcs5S2ParametersGenerator in '..\..\CryptoLib\src\Interfaces\ClpIPkcs5S2ParametersGenerator.pas';
+  ClpIPkcs5S2ParametersGenerator in '..\..\CryptoLib\src\Interfaces\ClpIPkcs5S2ParametersGenerator.pas',
+  ClpISchnorr in '..\..\CryptoLib\src\Interfaces\ClpISchnorr.pas',
+  ClpECSchnorrBSISigner in '..\..\CryptoLib\src\Crypto\Signers\ClpECSchnorrBSISigner.pas',
+  ClpIECSchnorrBSISigner in '..\..\CryptoLib\src\Interfaces\ClpIECSchnorrBSISigner.pas',
+  ClpIECSchnorrISOSigner in '..\..\CryptoLib\src\Interfaces\ClpIECSchnorrISOSigner.pas',
+  ClpECSchnorrISOSigner in '..\..\CryptoLib\src\Crypto\Signers\ClpECSchnorrISOSigner.pas',
+  ClpIECSchnorrISOXSigner in '..\..\CryptoLib\src\Interfaces\ClpIECSchnorrISOXSigner.pas',
+  ClpECSchnorrISOXSigner in '..\..\CryptoLib\src\Crypto\Signers\ClpECSchnorrISOXSigner.pas',
+  ClpIECSchnorrLIBSECPSigner in '..\..\CryptoLib\src\Interfaces\ClpIECSchnorrLIBSECPSigner.pas',
+  ClpECSchnorrLIBSECPSigner in '..\..\CryptoLib\src\Crypto\Signers\ClpECSchnorrLIBSECPSigner.pas';
 
 begin
   try

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

@@ -401,7 +401,16 @@ uses
   ClpPkcs5S2ParametersGenerator in '..\..\CryptoLib\src\Crypto\Generators\ClpPkcs5S2ParametersGenerator.pas',
   ClpIPkcs5S2ParametersGenerator in '..\..\CryptoLib\src\Interfaces\ClpIPkcs5S2ParametersGenerator.pas',
   Pkcs5Tests in '..\src\Crypto\Pkcs5Tests.pas',
-  ClpIFilterStream in '..\..\CryptoLib\src\Interfaces\ClpIFilterStream.pas';
+  ClpIFilterStream in '..\..\CryptoLib\src\Interfaces\ClpIFilterStream.pas',
+  ClpISchnorr in '..\..\CryptoLib\src\Interfaces\ClpISchnorr.pas',
+  ClpECSchnorrBSISigner in '..\..\CryptoLib\src\Crypto\Signers\ClpECSchnorrBSISigner.pas',
+  ClpIECSchnorrBSISigner in '..\..\CryptoLib\src\Interfaces\ClpIECSchnorrBSISigner.pas',
+  ClpIECSchnorrISOSigner in '..\..\CryptoLib\src\Interfaces\ClpIECSchnorrISOSigner.pas',
+  ClpECSchnorrISOSigner in '..\..\CryptoLib\src\Crypto\Signers\ClpECSchnorrISOSigner.pas',
+  ClpIECSchnorrISOXSigner in '..\..\CryptoLib\src\Interfaces\ClpIECSchnorrISOXSigner.pas',
+  ClpECSchnorrISOXSigner in '..\..\CryptoLib\src\Crypto\Signers\ClpECSchnorrISOXSigner.pas',
+  ClpIECSchnorrLIBSECPSigner in '..\..\CryptoLib\src\Interfaces\ClpIECSchnorrLIBSECPSigner.pas',
+  ClpECSchnorrLIBSECPSigner in '..\..\CryptoLib\src\Crypto\Signers\ClpECSchnorrLIBSECPSigner.pas';
 
 begin
 

+ 3 - 3
CryptoLib.Tests/src/Others/ECSchnorrTests.pas

@@ -81,7 +81,7 @@ type
     procedure TestECSchnorrWithCustomK;
     procedure TestECSchnorrBSI;
     procedure TestECSchnorrISO;
-    procedure TestECSchnorrISOx;
+    procedure TestECSchnorrISOX;
     procedure TestECSchnorrLIBSECP;
 
   end;
@@ -198,7 +198,7 @@ begin
 
 end;
 
-procedure TTestECSchnorr.TestECSchnorrISOx;
+procedure TTestECSchnorr.TestECSchnorrISOX;
 var
   LCurve: IX9ECParameters;
   domain: IECDomainParameters;
@@ -224,7 +224,7 @@ begin
   privParams := keypair.Private as IECPrivateKeyParameters; // for signing
   pubParams := keypair.Public as IECPublicKeyParameters; // for verifying
 
-  signer := TSignerUtilities.GetSigner('SHA-256withECSCHNORRISOx');
+  signer := TSignerUtilities.GetSigner('SHA-256withECSCHNORRISOX');
 
   // sign
 

+ 148 - 0
CryptoLib/src/Crypto/Signers/ClpECSchnorrBSISigner.pas

@@ -0,0 +1,148 @@
+{ *********************************************************************************** }
+{ *                              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 ClpECSchnorrBSISigner;
+
+{$I ..\..\Include\CryptoLib.inc}
+
+interface
+
+uses
+  ClpIECInterface,
+  ClpIECPrivateKeyParameters,
+  ClpIECPublicKeyParameters,
+  ClpISchnorr,
+  ClpIECSchnorrBSISigner,
+  ClpIDigest,
+  ClpBits,
+  ClpBigInteger,
+  ClpCryptoLibTypes;
+
+type
+  TECSchnorrBSISigner = class sealed(TInterfacedObject, ISchnorr,
+    IECSchnorrBSISigner)
+
+  public
+    function GetAlgorithmName: String; inline;
+    property AlgorithmName: String read GetAlgorithmName;
+
+    function Do_Sign(const &message: TCryptoLibByteArray; const digest: IDigest;
+      const pv_key: IECPrivateKeyParameters; const k: TBigInteger)
+      : TCryptoLibByteArray;
+
+    function Do_Verify(const &message: TCryptoLibByteArray; const digest: IDigest;
+      const pu_key: IECPublicKeyParameters; const sig: TCryptoLibByteArray): Boolean;
+
+  end;
+
+implementation
+
+uses
+  // included here to avoid circular dependency :)
+  ClpECSchnorrSigner;
+
+{ TECSchnorrBSISigner }
+
+function TECSchnorrBSISigner.Do_Sign(const &message: TCryptoLibByteArray;
+  const digest: IDigest; const pv_key: IECPrivateKeyParameters;
+  const k: TBigInteger): TCryptoLibByteArray;
+var
+  curve: IECCurve;
+  n, r, s: TBigInteger;
+  G, q: IECPoint;
+  xQ, tempR: TCryptoLibByteArray;
+begin
+
+  curve := pv_key.parameters.curve;
+  n := curve.order;
+  G := pv_key.parameters.G;
+
+  q := G.Multiply(k);
+
+  xQ := q.Normalize.XCoord.ToBigInteger.ToByteArray;
+
+  digest.TransformBytes(&message);
+  digest.TransformBytes(xQ);
+  tempR := digest.TransformFinal.GetBytes();
+
+  r := TBigInteger.Create(1, tempR);
+  s := (k.Subtract(r.Multiply(pv_key.D))).&Mod(n);
+  if (r.CompareTo(TBigInteger.Zero) = 0) or (s.CompareTo(TBigInteger.Zero) = 0)
+  then
+  begin
+    Result := Nil;
+    Exit;
+  end
+  else
+  begin
+    Result := TECSchnorrSigner.Encode_Sig(r, s);
+    Exit;
+  end;
+end;
+
+function TECSchnorrBSISigner.Do_Verify(const &message: TCryptoLibByteArray;
+  const digest: IDigest; const pu_key: IECPublicKeyParameters;
+  const sig: TCryptoLibByteArray): Boolean;
+var
+  curve: IECCurve;
+  n, r, s, v: TBigInteger;
+  Size: Int32;
+  G, q, sG, rW: IECPoint;
+  xQ, tempV: TCryptoLibByteArray;
+  R_and_S: TCryptoLibGenericArray<TBigInteger>;
+begin
+
+  curve := pu_key.parameters.curve;
+  n := curve.order;
+  G := pu_key.parameters.G;
+  Size := TBits.Asr32(curve.FieldSize, 3);
+
+  R_and_S := TECSchnorrSigner.Decode_Sig(sig);
+
+  r := R_and_S[0];
+  s := R_and_S[1];
+
+  if (not(r.IsInitialized) or (r.CompareTo(TBigInteger.Two.Pow(Size * 8)
+    .Subtract(TBigInteger.One)) = 1) or (s.CompareTo(TBigInteger.Zero) = 0) or
+    (s.CompareTo(n.Subtract(TBigInteger.One)) = 1)) then
+  begin
+    Result := False;
+    Exit;
+  end;
+
+  sG := G.Multiply(s);
+
+  rW := pu_key.q.Multiply(r);
+  q := sG.Add(rW);
+  xQ := q.Normalize.XCoord.ToBigInteger.ToByteArray;
+
+  digest.TransformBytes(&message);
+  digest.TransformBytes(xQ);
+  tempV := digest.TransformFinal.GetBytes();
+
+  v := TBigInteger.Create(1, tempV);
+  Result := v.Equals(r);
+  Exit;
+
+end;
+
+function TECSchnorrBSISigner.GetAlgorithmName: String;
+begin
+  Result := 'BSI';
+end;
+
+end.

+ 153 - 0
CryptoLib/src/Crypto/Signers/ClpECSchnorrISOSigner.pas

@@ -0,0 +1,153 @@
+{ *********************************************************************************** }
+{ *                              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 ClpECSchnorrISOSigner;
+
+{$I ..\..\Include\CryptoLib.inc}
+
+interface
+
+uses
+  ClpIECInterface,
+  ClpIECPrivateKeyParameters,
+  ClpIECPublicKeyParameters,
+  ClpISchnorr,
+  ClpIECSchnorrISOSigner,
+  ClpIDigest,
+  ClpBits,
+  ClpBigInteger,
+  ClpCryptoLibTypes;
+
+type
+  TECSchnorrISOSigner = class sealed(TInterfacedObject, ISchnorr,
+    IECSchnorrISOSigner)
+
+  public
+    function GetAlgorithmName: String; inline;
+    property AlgorithmName: String read GetAlgorithmName;
+
+    function Do_Sign(const &message: TCryptoLibByteArray; const digest: IDigest;
+      const pv_key: IECPrivateKeyParameters; const k: TBigInteger)
+      : TCryptoLibByteArray;
+
+    function Do_Verify(const &message: TCryptoLibByteArray; const digest: IDigest;
+      const pu_key: IECPublicKeyParameters;
+      const sig: TCryptoLibByteArray): Boolean;
+
+  end;
+
+implementation
+
+uses
+  // included here to avoid circular dependency :)
+  ClpECSchnorrSigner;
+
+{ TECSchnorrISOSigner }
+
+function TECSchnorrISOSigner.Do_Sign(const &message: TCryptoLibByteArray;
+  const digest: IDigest; const pv_key: IECPrivateKeyParameters;
+  const k: TBigInteger): TCryptoLibByteArray;
+var
+  curve: IECCurve;
+  n, r, s: TBigInteger;
+  G, q: IECPoint;
+  xQ, yQ, tempR: TCryptoLibByteArray;
+begin
+
+  curve := pv_key.parameters.curve;
+  n := curve.order;
+  G := pv_key.parameters.G;
+
+  q := G.Multiply(k);
+
+  xQ := q.Normalize.XCoord.ToBigInteger.ToByteArray;
+  yQ := q.Normalize.YCoord.ToBigInteger.ToByteArray;
+
+  digest.TransformBytes(xQ);
+  digest.TransformBytes(yQ);
+  digest.TransformBytes(&message);
+  tempR := digest.TransformFinal.GetBytes();
+
+  r := TBigInteger.Create(1, tempR);
+  s := (k.Add(r.Multiply(pv_key.D))).&Mod(n);
+  if (r.CompareTo(TBigInteger.Zero) = 0) or (s.CompareTo(TBigInteger.Zero) = 0)
+  then
+  begin
+    Result := Nil;
+    Exit;
+  end
+  else
+  begin
+    Result := TECSchnorrSigner.Encode_Sig(r, s);
+    Exit;
+  end;
+end;
+
+function TECSchnorrISOSigner.Do_Verify(const &message: TCryptoLibByteArray;
+  const digest: IDigest; const pu_key: IECPublicKeyParameters;
+  const sig: TCryptoLibByteArray): Boolean;
+var
+  curve: IECCurve;
+  n, r, s, v: TBigInteger;
+  Size: Int32;
+  G, q, sG, rW: IECPoint;
+  xQ, yQ, tempV: TCryptoLibByteArray;
+  R_and_S: TCryptoLibGenericArray<TBigInteger>;
+begin
+
+  curve := pu_key.parameters.curve;
+  n := curve.order;
+  G := pu_key.parameters.G;
+  Size := TBits.Asr32(curve.FieldSize, 3);
+
+  R_and_S := TECSchnorrSigner.Decode_Sig(sig);
+
+  r := R_and_S[0];
+  s := R_and_S[1];
+
+  if (not(r.IsInitialized) or (r.CompareTo(TBigInteger.Two.Pow(Size * 8)
+    .Subtract(TBigInteger.One)) = 1) or (s.CompareTo(TBigInteger.Zero) = 0) or
+    (s.CompareTo(n.Subtract(TBigInteger.One)) = 1)) then
+  begin
+    Result := False;
+    Exit;
+  end;
+
+  sG := G.Multiply(s);
+
+  rW := pu_key.q.Multiply(r);
+  q := sG.Subtract(rW);
+  xQ := q.Normalize.XCoord.ToBigInteger.ToByteArray;
+  yQ := q.Normalize.YCoord.ToBigInteger.ToByteArray;
+
+  digest.TransformBytes(xQ);
+  digest.TransformBytes(yQ);
+  digest.TransformBytes(&message);
+  tempV := digest.TransformFinal.GetBytes();
+
+  v := TBigInteger.Create(1, tempV);
+  Result := v.Equals(r);
+  Exit;
+
+end;
+
+function TECSchnorrISOSigner.GetAlgorithmName: String;
+begin
+  Result := 'ISO';
+end;
+
+end.

+ 149 - 0
CryptoLib/src/Crypto/Signers/ClpECSchnorrISOXSigner.pas

@@ -0,0 +1,149 @@
+{ *********************************************************************************** }
+{ *                              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 ClpECSchnorrISOXSigner;
+
+{$I ..\..\Include\CryptoLib.inc}
+
+interface
+
+uses
+  ClpIECInterface,
+  ClpIECPrivateKeyParameters,
+  ClpIECPublicKeyParameters,
+  ClpISchnorr,
+  ClpIECSchnorrISOXSigner,
+  ClpIDigest,
+  ClpBits,
+  ClpBigInteger,
+  ClpCryptoLibTypes;
+
+type
+  TECSchnorrISOXSigner = class sealed(TInterfacedObject, ISchnorr,
+    IECSchnorrISOXSigner)
+
+  public
+    function GetAlgorithmName: String; inline;
+    property AlgorithmName: String read GetAlgorithmName;
+
+    function Do_Sign(const &message: TCryptoLibByteArray; const digest: IDigest;
+      const pv_key: IECPrivateKeyParameters; const k: TBigInteger)
+      : TCryptoLibByteArray;
+
+    function Do_Verify(const &message: TCryptoLibByteArray;
+      const digest: IDigest; const pu_key: IECPublicKeyParameters;
+      const sig: TCryptoLibByteArray): Boolean;
+
+  end;
+
+implementation
+
+uses
+  // included here to avoid circular dependency :)
+  ClpECSchnorrSigner;
+
+{ TECSchnorrISOXSigner }
+
+function TECSchnorrISOXSigner.Do_Sign(const &message: TCryptoLibByteArray;
+  const digest: IDigest; const pv_key: IECPrivateKeyParameters;
+  const k: TBigInteger): TCryptoLibByteArray;
+var
+  curve: IECCurve;
+  n, r, s: TBigInteger;
+  G, q: IECPoint;
+  xQ, tempR: TCryptoLibByteArray;
+begin
+
+  curve := pv_key.parameters.curve;
+  n := curve.order;
+  G := pv_key.parameters.G;
+
+  q := G.Multiply(k);
+
+  xQ := q.Normalize.XCoord.ToBigInteger.ToByteArray;
+
+  digest.TransformBytes(xQ);
+  digest.TransformBytes(&message);
+  tempR := digest.TransformFinal.GetBytes();
+
+  r := TBigInteger.Create(1, tempR);
+  s := (k.Add(r.Multiply(pv_key.D))).&Mod(n);
+  if (r.CompareTo(TBigInteger.Zero) = 0) or (s.CompareTo(TBigInteger.Zero) = 0)
+  then
+  begin
+    Result := Nil;
+    Exit;
+  end
+  else
+  begin
+    Result := TECSchnorrSigner.Encode_Sig(r, s);
+    Exit;
+  end;
+end;
+
+function TECSchnorrISOXSigner.Do_Verify(const &message: TCryptoLibByteArray;
+  const digest: IDigest; const pu_key: IECPublicKeyParameters;
+  const sig: TCryptoLibByteArray): Boolean;
+var
+  curve: IECCurve;
+  n, r, s, v: TBigInteger;
+  Size: Int32;
+  G, q, sG, rW: IECPoint;
+  xQ, tempV: TCryptoLibByteArray;
+  R_and_S: TCryptoLibGenericArray<TBigInteger>;
+begin
+
+  curve := pu_key.parameters.curve;
+  n := curve.order;
+  G := pu_key.parameters.G;
+  Size := TBits.Asr32(curve.FieldSize, 3);
+
+  R_and_S := TECSchnorrSigner.Decode_Sig(sig);
+
+  r := R_and_S[0];
+  s := R_and_S[1];
+
+  if (not(r.IsInitialized) or (r.CompareTo(TBigInteger.Two.Pow(Size * 8)
+    .Subtract(TBigInteger.One)) = 1) or (s.CompareTo(TBigInteger.Zero) = 0) or
+    (s.CompareTo(n.Subtract(TBigInteger.One)) = 1)) then
+  begin
+    Result := False;
+    Exit;
+  end;
+
+  sG := G.Multiply(s);
+
+  rW := pu_key.q.Multiply(r);
+  q := sG.Subtract(rW);
+  xQ := q.Normalize.XCoord.ToBigInteger.ToByteArray;
+
+  digest.TransformBytes(xQ);
+  digest.TransformBytes(&message);
+  tempV := digest.TransformFinal.GetBytes();
+
+  v := TBigInteger.Create(1, tempV);
+  Result := v.Equals(r);
+  Exit;
+
+end;
+
+function TECSchnorrISOXSigner.GetAlgorithmName: String;
+begin
+  Result := 'ISOX';
+end;
+
+end.

+ 158 - 0
CryptoLib/src/Crypto/Signers/ClpECSchnorrLIBSECPSigner.pas

@@ -0,0 +1,158 @@
+{ *********************************************************************************** }
+{ *                              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 ClpECSchnorrLIBSECPSigner;
+
+{$I ..\..\Include\CryptoLib.inc}
+
+interface
+
+uses
+  ClpIECInterface,
+  ClpIECPrivateKeyParameters,
+  ClpIECPublicKeyParameters,
+  ClpISchnorr,
+  ClpIECSchnorrLIBSECPSigner,
+  ClpIDigest,
+  ClpBits,
+  ClpBigInteger,
+  ClpCryptoLibTypes;
+
+type
+  TECSchnorrLIBSECPSigner = class sealed(TInterfacedObject, ISchnorr,
+    IECSchnorrLIBSECPSigner)
+
+  public
+    function GetAlgorithmName: String; inline;
+    property AlgorithmName: String read GetAlgorithmName;
+
+    function Do_Sign(const &message: TCryptoLibByteArray; const digest: IDigest;
+      const pv_key: IECPrivateKeyParameters; const k: TBigInteger)
+      : TCryptoLibByteArray;
+
+    function Do_Verify(const &message: TCryptoLibByteArray;
+      const digest: IDigest; const pu_key: IECPublicKeyParameters;
+      const sig: TCryptoLibByteArray): Boolean;
+
+  end;
+
+implementation
+
+uses
+  // included here to avoid circular dependency :)
+  ClpECSchnorrSigner;
+
+{ TECSchnorrLIBSECPSigner }
+
+function TECSchnorrLIBSECPSigner.Do_Sign(const &message: TCryptoLibByteArray;
+  const digest: IDigest; const pv_key: IECPrivateKeyParameters;
+  const k: TBigInteger): TCryptoLibByteArray;
+var
+  curve: IECCurve;
+  n, r, s, h, tempK: TBigInteger;
+  G, q: IECPoint;
+  rQ, tempH: TCryptoLibByteArray;
+begin
+
+  curve := pv_key.parameters.curve;
+  n := curve.order;
+  G := pv_key.parameters.G;
+
+  q := G.Multiply(k);
+
+  tempK := k;
+  if q.Normalize.YCoord.ToBigInteger.&And(TBigInteger.One)
+    .CompareTo(TBigInteger.One) = 0 then // if Q.y is Odd
+  begin
+    tempK := n.Subtract(tempK);
+    q := G.Multiply(tempK);
+  end;
+
+  rQ := q.Normalize.XCoord.ToBigInteger.&Mod(n).ToByteArray;
+  digest.TransformBytes(rQ);
+  digest.TransformBytes(&message);
+  tempH := digest.TransformFinal.GetBytes();
+
+  h := TBigInteger.Create(1, tempH);
+  r := q.Normalize.XCoord.ToBigInteger.&Mod(n);
+  s := (tempK.Subtract(h.Multiply(pv_key.D))).&Mod(n);
+
+  Result := TECSchnorrSigner.Encode_Sig(r, s);
+  Exit;
+
+end;
+
+function TECSchnorrLIBSECPSigner.Do_Verify(const &message: TCryptoLibByteArray;
+  const digest: IDigest; const pu_key: IECPublicKeyParameters;
+  const sig: TCryptoLibByteArray): Boolean;
+var
+  curve: IECCurve;
+  n, r, s, h, v: TBigInteger;
+  Size: Int32;
+  G, sG, hW, LR: IECPoint;
+  tempH, rb: TCryptoLibByteArray;
+  R_and_S: TCryptoLibGenericArray<TBigInteger>;
+begin
+
+  curve := pu_key.parameters.curve;
+  n := curve.order;
+  G := pu_key.parameters.G;
+  Size := TBits.Asr32(curve.FieldSize, 3);
+
+  R_and_S := TECSchnorrSigner.Decode_Sig(sig);
+
+  r := R_and_S[0];
+  s := R_and_S[1];
+
+  if (not(r.IsInitialized) or (r.CompareTo(TBigInteger.Two.Pow(Size * 8)
+    .Subtract(TBigInteger.One)) = 1) or (s.CompareTo(TBigInteger.Zero) = 0) or
+    (s.CompareTo(n.Subtract(TBigInteger.One)) = 1)) then
+  begin
+    Result := False;
+    Exit;
+  end;
+
+  sG := G.Multiply(s);
+
+  rb := r.ToByteArray;
+
+  digest.TransformBytes(rb);
+  digest.TransformBytes(&message);
+  tempH := digest.TransformFinal.GetBytes();
+
+  h := TBigInteger.Create(1, tempH);
+  if (h.CompareTo(TBigInteger.Zero) = 0) or (h.CompareTo(n) = 1) then
+  begin
+    Result := False;
+    Exit;
+  end;
+
+  hW := pu_key.q.Multiply(h);
+  LR := sG.Add(hW);
+  v := LR.Normalize.XCoord.ToBigInteger.&Mod(n);
+
+  Result := v.Equals(r);
+  Exit;
+
+end;
+
+function TECSchnorrLIBSECPSigner.GetAlgorithmName: String;
+begin
+  Result := 'LIBSECP';
+end;
+
+end.

+ 23 - 236
CryptoLib/src/Crypto/Signers/ClpECSchnorrSigner.pas

@@ -29,6 +29,7 @@ uses
   ClpSecureRandom,
   ClpISecureRandom,
   ClpICipherParameters,
+  ClpISchnorr,
   ClpIECSchnorrSigner,
   ClpIParametersWithRandom,
   ClpDerSequence,
@@ -41,18 +42,15 @@ uses
   ClpIECKeyParameters,
   ClpIECPublicKeyParameters,
   ClpIECPrivateKeyParameters,
-  ClpIECInterface,
-  ClpBits,
   ClpCryptoLibTypes;
 
 resourcestring
   SECPublicKeyNotFound = 'EC Public Key Required for Verification';
   SECPrivateKeyNotFound = 'EC Private Key Required for Signing';
   SCurveNil = 'Key has no Curve';
-  SUnSupportedVariant = 'Schnorr Variant not Supported %s';
 
 type
-  TECSchnorrSigner = class sealed(TInterfacedObject, ISigner, IECSchnorrSigner)
+  TECSchnorrSigner = class(TInterfacedObject, ISigner, IECSchnorrSigner)
 
   strict private
 
@@ -62,7 +60,7 @@ type
 
   var
     FDigest: IDigest;
-    FVariant: String;
+    FSigner: ISchnorr;
     FforSigning: Boolean;
     Fkey: IECKeyParameters;
     FBuffer: TMemoryStream;
@@ -87,21 +85,22 @@ type
     function Sign_K(const pv_key: IECPrivateKeyParameters; const k: TBigInteger)
       : TCryptoLibByteArray;
 
+    class constructor ECSchnorrSigner();
+
+  public
+
     function Do_Sign(const pv_key: IECPrivateKeyParameters;
       const k: TBigInteger): TCryptoLibByteArray;
 
     function Do_Verify(const pu_key: IECPublicKeyParameters;
       sig: TCryptoLibByteArray): Boolean;
 
-    class function Encode_Sig(const r, s: TBigInteger): TCryptoLibByteArray;
-      static; inline;
+    class function Encode_Sig(const r, s: TBigInteger)
+      : TCryptoLibByteArray; static;
 
     class function Decode_Sig(sig: TCryptoLibByteArray)
-      : TCryptoLibGenericArray<TBigInteger>; static; inline;
+      : TCryptoLibGenericArray<TBigInteger>; static;
 
-    class constructor ECSchnorrSigner();
-
-  public
 
     // ECSchnorr signer implementation according to:
     //
@@ -110,8 +109,6 @@ type
     // - `bitcoin-core:libsecp256k1 <https://github.com/bitcoin-core/secp256k1/blob/master/src/modules/schnorr/schnorr_impl.h>`_
     //
     //
-    // In order to select the specification to be conform to, choose
-    // the corresponding string option: "BSI", "ISO", "ISOx", "LIBSECP"
     //
     // *Signature*:
     //
@@ -131,7 +128,7 @@ type
     // 4. s = (k + r.d) mod n
     // If s = 0 goto 1.
     // 5. Output (r, s)
-    // - "ISOx": compute r,s according to optimized ISO variant:
+    // - "ISOX": compute r,s according to optimized ISO variant:
     // 1. k = RNG(1:n-1)
     // 2. Q = [k]G
     // If r = 0 mod n, goto 1.
@@ -164,7 +161,7 @@ type
     // If Q = 0, output Error and terminate.
     // 3. v = H(Qx||Qy||M).
     // 4. Output True if v = r, and False otherwise.
-    // - "ISOx": verify r,s according to optimized ISO variant:
+    // - "ISOX": verify r,s according to optimized ISO variant:
     // 1. check...
     // 2. Q = [s]G - [r]W
     // If Q = 0, output Error and terminate.
@@ -179,13 +176,13 @@ type
     // Signature is invalid if R is infinity or R's y coordinate is odd.
     // 4. Signature is valid if the serialization of R's x coordinate equals r.
 
+    /// <param name="signer">
+    /// instance of one of "BSI","ISO","ISOX","LIBSECP"
+    /// </param>
     /// <param name="digest">
     /// initialized "IDigest" instance.
     /// </param>
-    /// <param name="schnorr_variant">
-    /// one of "BSI","ISO","ISOx","LIBSECP"
-    /// </param>
-    constructor Create(const digest: IDigest; const schnorr_variant: String);
+    constructor Create(const signer: ISchnorr; const digest: IDigest);
     destructor Destroy(); override;
 
     function GetAlgorithmName: String;
@@ -260,12 +257,12 @@ begin
   FBuffer.Write(input[inOff], length);
 end;
 
-constructor TECSchnorrSigner.Create(const digest: IDigest;
-  const schnorr_variant: String);
+constructor TECSchnorrSigner.Create(const signer: ISchnorr;
+  const digest: IDigest);
 begin
   inherited Create();
   FDigest := digest;
-  FVariant := schnorr_variant;
+  FSigner := signer;
   FBuffer := TMemoryStream.Create();
 end;
 
@@ -277,236 +274,26 @@ end;
 
 function TECSchnorrSigner.Do_Sign(const pv_key: IECPrivateKeyParameters;
   const k: TBigInteger): TCryptoLibByteArray;
-var
-  curve: IECCurve;
-  n, r, s, h, tempK: TBigInteger;
-  G, q: IECPoint;
-  xQ, yQ, rQ, tempR, tempH: TCryptoLibByteArray;
 begin
-  Result := Nil;
+
   if (pv_key.parameters.curve = Nil) then
   begin
     raise EArgumentNilCryptoLibException.CreateRes(@SCurveNil)
   end;
-  curve := pv_key.parameters.curve;
-  n := curve.order;
-  G := pv_key.parameters.G;
-
-  q := G.Multiply(k);
-
-  if FVariant = 'ISO' then
-  begin
-    xQ := q.Normalize.XCoord.ToBigInteger.ToByteArray;
-    yQ := q.Normalize.YCoord.ToBigInteger.ToByteArray;
-
-    FDigest.TransformBytes(xQ);
-    FDigest.TransformBytes(yQ);
-    FDigest.TransformBytes(Aggregate);
-    tempR := FDigest.TransformFinal.GetBytes();
-
-    r := TBigInteger.Create(1, tempR);
-    s := (k.Add(r.Multiply(pv_key.D))).&Mod(n);
-    if (r.CompareTo(TBigInteger.Zero) = 0) or (s.CompareTo(TBigInteger.Zero) = 0)
-    then
-    begin
-      Result := Nil;
-      Exit;
-    end
-    else
-    begin
-      Result := Encode_Sig(r, s);
-      Exit;
-    end;
-
-  end
-  else if FVariant = 'ISOx' then
-  begin
-    xQ := q.Normalize.XCoord.ToBigInteger.ToByteArray;
-
-    FDigest.TransformBytes(xQ);
-    FDigest.TransformBytes(Aggregate);
-    tempR := FDigest.TransformFinal.GetBytes();
-
-    r := TBigInteger.Create(1, tempR);
-    s := (k.Add(r.Multiply(pv_key.D))).&Mod(n);
-    if (r.CompareTo(TBigInteger.Zero) = 0) or (s.CompareTo(TBigInteger.Zero) = 0)
-    then
-    begin
-      Result := Nil;
-      Exit;
-    end
-    else
-    begin
-      Result := Encode_Sig(r, s);
-      Exit;
-    end;
-
-  end
-  else if FVariant = 'BSI' then
-  begin
-    xQ := q.Normalize.XCoord.ToBigInteger.ToByteArray;
-
-    FDigest.TransformBytes(Aggregate);
-    FDigest.TransformBytes(xQ);
-    tempR := FDigest.TransformFinal.GetBytes();
-
-    r := TBigInteger.Create(1, tempR);
-    s := (k.Subtract(r.Multiply(pv_key.D))).&Mod(n);
-    if (r.CompareTo(TBigInteger.Zero) = 0) or (s.CompareTo(TBigInteger.Zero) = 0)
-    then
-    begin
-      Result := Nil;
-      Exit;
-    end
-    else
-    begin
-      Result := Encode_Sig(r, s);
-      Exit;
-    end;
-
-  end
-  else if FVariant = 'LIBSECP' then
-  begin
-    tempK := k;
-    if q.Normalize.YCoord.ToBigInteger.&And(TBigInteger.One)
-      .CompareTo(TBigInteger.One) = 0 then // if Q.y is Odd
-    begin
-      tempK := n.Subtract(tempK);
-      q := G.Multiply(tempK);
-    end;
-
-    rQ := q.Normalize.XCoord.ToBigInteger.&Mod(n).ToByteArray;
-    FDigest.TransformBytes(rQ);
-    FDigest.TransformBytes(Aggregate);
-    tempH := FDigest.TransformFinal.GetBytes();
-
-    h := TBigInteger.Create(1, tempH);
-    r := q.Normalize.XCoord.ToBigInteger.&Mod(n);
-    s := (tempK.Subtract(h.Multiply(pv_key.D))).&Mod(n);
-
-    Result := Encode_Sig(r, s);
-    Exit;
-
-  end
-  else
-  begin
-    raise EArgumentCryptoLibException.CreateResFmt(@SUnSupportedVariant,
-      [FVariant]);
-  end;
 
+  Result := FSigner.Do_Sign(Aggregate(), FDigest, pv_key, k);
 end;
 
 function TECSchnorrSigner.Do_Verify(const pu_key: IECPublicKeyParameters;
   sig: TCryptoLibByteArray): Boolean;
-var
-  curve: IECCurve;
-  n, r, s, h, v: TBigInteger;
-  Size: Int32;
-  G, q, sG, rW, hW, LR: IECPoint;
-  xQ, yQ, tempV, tempH, rb: TCryptoLibByteArray;
-  R_and_S: TCryptoLibGenericArray<TBigInteger>;
 begin
 
   if (pu_key.parameters.curve = Nil) then
   begin
     raise EArgumentNilCryptoLibException.CreateRes(@SCurveNil)
   end;
-  curve := pu_key.parameters.curve;
-  n := curve.order;
-  G := pu_key.parameters.G;
-  Size := TBits.Asr32(curve.FieldSize, 3);
-
-  R_and_S := Decode_Sig(sig);
-
-  r := R_and_S[0];
-  s := R_and_S[1];
-
-  if (not(r.IsInitialized) or (r.CompareTo(TBigInteger.Two.Pow(Size * 8)
-    .Subtract(TBigInteger.One)) = 1) or (s.CompareTo(TBigInteger.Zero) = 0) or
-    (s.CompareTo(n.Subtract(TBigInteger.One)) = 1)) then
-  begin
-    Result := False;
-    Exit;
-  end;
-
-  sG := G.Multiply(s);
-
-  if FVariant = 'ISO' then
-  begin
-    rW := pu_key.q.Multiply(r);
-    q := sG.Subtract(rW);
-    xQ := q.Normalize.XCoord.ToBigInteger.ToByteArray;
-    yQ := q.Normalize.YCoord.ToBigInteger.ToByteArray;
-
-    FDigest.TransformBytes(xQ);
-    FDigest.TransformBytes(yQ);
-    FDigest.TransformBytes(Aggregate);
-    tempV := FDigest.TransformFinal.GetBytes();
-
-    v := TBigInteger.Create(1, tempV);
-    Result := v.Equals(r);
-    Exit;
-
-  end
-  else if FVariant = 'ISOx' then
-  begin
-    rW := pu_key.q.Multiply(r);
-    q := sG.Subtract(rW);
-    xQ := q.Normalize.XCoord.ToBigInteger.ToByteArray;
-
-    FDigest.TransformBytes(xQ);
-    FDigest.TransformBytes(Aggregate);
-    tempV := FDigest.TransformFinal.GetBytes();
-
-    v := TBigInteger.Create(1, tempV);
-    Result := v.Equals(r);
-    Exit;
-
-  end
-  else if FVariant = 'BSI' then
-  begin
-    rW := pu_key.q.Multiply(r);
-    q := sG.Add(rW);
-    xQ := q.Normalize.XCoord.ToBigInteger.ToByteArray;
-
-    FDigest.TransformBytes(Aggregate);
-    FDigest.TransformBytes(xQ);
-    tempV := FDigest.TransformFinal.GetBytes();
-
-    v := TBigInteger.Create(1, tempV);
-    Result := v.Equals(r);
-    Exit;
-
-  end
-  else if FVariant = 'LIBSECP' then
-  begin
-    rb := r.ToByteArray;
-
-    FDigest.TransformBytes(rb);
-    FDigest.TransformBytes(Aggregate);
-    tempH := FDigest.TransformFinal.GetBytes();
-
-    h := TBigInteger.Create(1, tempH);
-    if (h.CompareTo(TBigInteger.Zero) = 0) or (h.CompareTo(n) = 1) then
-    begin
-      Result := False;
-      Exit;
-    end;
-
-    hW := pu_key.q.Multiply(h);
-    LR := sG.Add(hW);
-    v := LR.Normalize.XCoord.ToBigInteger.&Mod(n);
-
-    Result := v.Equals(r);
-    Exit;
-
-  end
-  else
-  begin
-    raise EArgumentCryptoLibException.CreateResFmt(@SUnSupportedVariant,
-      [FVariant]);
-  end;
 
+  Result := FSigner.Do_Verify(Aggregate(), FDigest, pu_key, sig);
 end;
 
 function TECSchnorrSigner.GenerateSignature: TCryptoLibByteArray;
@@ -531,7 +318,7 @@ end;
 
 function TECSchnorrSigner.GetAlgorithmName: String;
 begin
-  Result := FDigest.Name + 'with' + 'ECSCHNORR' + FVariant;
+  Result := FDigest.Name + 'with' + 'ECSCHNORR' + FSigner.AlgorithmName;
 end;
 
 procedure TECSchnorrSigner.Init(forSigning: Boolean;

+ 35 - 0
CryptoLib/src/Interfaces/ClpIECSchnorrBSISigner.pas

@@ -0,0 +1,35 @@
+{ *********************************************************************************** }
+{ *                              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 ClpIECSchnorrBSISigner;
+
+{$I ..\Include\CryptoLib.inc}
+
+interface
+
+uses
+  ClpISchnorr;
+
+type
+  IECSchnorrBSISigner = interface(ISchnorr)
+
+   ['{799FABB1-D1BB-4B58-9E49-CF1CD8142554}']
+  end;
+
+implementation
+
+end.

+ 35 - 0
CryptoLib/src/Interfaces/ClpIECSchnorrISOSigner.pas

@@ -0,0 +1,35 @@
+{ *********************************************************************************** }
+{ *                              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 ClpIECSchnorrISOSigner;
+
+{$I ..\Include\CryptoLib.inc}
+
+interface
+
+uses
+  ClpISchnorr;
+
+type
+  IECSchnorrISOSigner = interface(ISchnorr)
+
+    ['{B3E5638F-0D51-4D3F-9505-5B240D894229}']
+  end;
+
+implementation
+
+end.

+ 35 - 0
CryptoLib/src/Interfaces/ClpIECSchnorrISOXSigner.pas

@@ -0,0 +1,35 @@
+{ *********************************************************************************** }
+{ *                              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 ClpIECSchnorrISOXSigner;
+
+{$I ..\Include\CryptoLib.inc}
+
+interface
+
+uses
+  ClpISchnorr;
+
+type
+  IECSchnorrISOXSigner = interface(ISchnorr)
+
+    ['{D9BC810A-0554-4D54-A6D8-5350667BB3D5}']
+  end;
+
+implementation
+
+end.

+ 35 - 0
CryptoLib/src/Interfaces/ClpIECSchnorrLIBSECPSigner.pas

@@ -0,0 +1,35 @@
+{ *********************************************************************************** }
+{ *                              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 ClpIECSchnorrLIBSECPSigner;
+
+{$I ..\Include\CryptoLib.inc}
+
+interface
+
+uses
+  ClpISchnorr;
+
+type
+  IECSchnorrLIBSECPSigner = interface(ISchnorr)
+
+    ['{AE748071-90D2-4EE5-9721-E69286BCC359}']
+  end;
+
+implementation
+
+end.

+ 8 - 33
CryptoLib/src/Interfaces/ClpIECSchnorrSigner.pas

@@ -22,46 +22,21 @@ unit ClpIECSchnorrSigner;
 interface
 
 uses
-  ClpICipherParameters,
+  ClpISigner,
+  ClpIECPublicKeyParameters,
   ClpIECPrivateKeyParameters,
   ClpBigInteger,
   ClpCryptoLibTypes;
 
 type
-  IECSchnorrSigner = interface(IInterface)
+  IECSchnorrSigner = interface(ISigner)
     ['{A941F9C5-81BE-4F0D-9294-2488C21035E3}']
 
-    function GetAlgorithmName: String;
-    property AlgorithmName: String read GetAlgorithmName;
+    function Do_Sign(const pv_key: IECPrivateKeyParameters;
+      const k: TBigInteger): TCryptoLibByteArray;
 
-    procedure Init(forSigning: Boolean; const parameters: ICipherParameters);
-
-    /// <summary>
-    /// update the internal digest with the byte b
-    /// </summary>
-    procedure Update(input: Byte);
-
-    /// <summary>
-    /// update the internal digest with the byte array in
-    /// </summary>
-    procedure BlockUpdate(input: TCryptoLibByteArray; inOff, length: Int32);
-
-    /// <summary>
-    /// Generate a signature for the message we've been loaded with using the
-    /// key we were initialised with.
-    /// </summary>
-    function GenerateSignature(): TCryptoLibByteArray;
-
-    /// <returns>
-    /// true if the internal state represents the signature described in the
-    /// passed in array.
-    /// </returns>
-    function VerifySignature(signature: TCryptoLibByteArray): Boolean;
-
-    /// <summary>
-    /// Reset the internal state
-    /// </summary>
-    procedure Reset();
+    function Do_Verify(const pu_key: IECPublicKeyParameters;
+      sig: TCryptoLibByteArray): Boolean;
 
     /// <summary>
     /// <para>
@@ -78,7 +53,7 @@ type
     /// <param name="k">
     /// known random number
     /// </param>
-    function Sign_K(const pv_key: IECPrivateKeyParameters;  const k: TBigInteger)
+    function Sign_K(const pv_key: IECPrivateKeyParameters; const k: TBigInteger)
       : TCryptoLibByteArray;
 
   end;

+ 50 - 0
CryptoLib/src/Interfaces/ClpISchnorr.pas

@@ -0,0 +1,50 @@
+{ *********************************************************************************** }
+{ *                              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 ClpISchnorr;
+
+{$I ..\Include\CryptoLib.inc}
+
+interface
+
+uses
+  ClpIECPrivateKeyParameters,
+  ClpIECPublicKeyParameters,
+  ClpIDigest,
+  ClpBigInteger,
+  ClpCryptoLibTypes;
+
+type
+  ISchnorr = interface(IInterface)
+    ['{D3E88536-CE8D-4933-ADD8-235CAD65819F}']
+
+    function GetAlgorithmName: String;
+    property AlgorithmName: String read GetAlgorithmName;
+
+    function Do_Sign(const &message: TCryptoLibByteArray; const digest: IDigest;
+      const pv_key: IECPrivateKeyParameters; const k: TBigInteger)
+      : TCryptoLibByteArray;
+
+    function Do_Verify(const &message: TCryptoLibByteArray;
+      const digest: IDigest; const pu_key: IECPublicKeyParameters;
+      const sig: TCryptoLibByteArray): Boolean;
+
+  end;
+
+implementation
+
+end.

+ 37 - 1
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="2" Minor="1"/>
-    <Files Count="360">
+    <Files Count="369">
       <Item1>
         <Filename Value="..\..\Asn1\ClpAsn1Encodable.pas"/>
         <UnitName Value="ClpAsn1Encodable"/>
@@ -1467,6 +1467,42 @@ Thanks to Sphere 10 Software (http://www.sphere10.com/) for sponsoring the devel
         <Filename Value="..\..\Interfaces\ClpIHMac.pas"/>
         <UnitName Value="ClpIHMac"/>
       </Item360>
+      <Item361>
+        <Filename Value="..\..\Interfaces\ClpIECSchnorrLIBSECPSigner.pas"/>
+        <UnitName Value="ClpIECSchnorrLIBSECPSigner"/>
+      </Item361>
+      <Item362>
+        <Filename Value="..\..\Interfaces\ClpIECSchnorrISOXSigner.pas"/>
+        <UnitName Value="ClpIECSchnorrISOXSigner"/>
+      </Item362>
+      <Item363>
+        <Filename Value="..\..\Interfaces\ClpIECSchnorrISOSigner.pas"/>
+        <UnitName Value="ClpIECSchnorrISOSigner"/>
+      </Item363>
+      <Item364>
+        <Filename Value="..\..\Interfaces\ClpIECSchnorrBSISigner.pas"/>
+        <UnitName Value="ClpIECSchnorrBSISigner"/>
+      </Item364>
+      <Item365>
+        <Filename Value="..\..\Interfaces\ClpISchnorr.pas"/>
+        <UnitName Value="ClpISchnorr"/>
+      </Item365>
+      <Item366>
+        <Filename Value="..\..\Crypto\Signers\ClpECSchnorrLIBSECPSigner.pas"/>
+        <UnitName Value="ClpECSchnorrLIBSECPSigner"/>
+      </Item366>
+      <Item367>
+        <Filename Value="..\..\Crypto\Signers\ClpECSchnorrISOXSigner.pas"/>
+        <UnitName Value="ClpECSchnorrISOXSigner"/>
+      </Item367>
+      <Item368>
+        <Filename Value="..\..\Crypto\Signers\ClpECSchnorrISOSigner.pas"/>
+        <UnitName Value="ClpECSchnorrISOSigner"/>
+      </Item368>
+      <Item369>
+        <Filename Value="..\..\Crypto\Signers\ClpECSchnorrBSISigner.pas"/>
+        <UnitName Value="ClpECSchnorrBSISigner"/>
+      </Item369>
     </Files>
     <RequiredPkgs Count="3">
       <Item1>

+ 4 - 1
CryptoLib/src/Packages/FPC/CryptoLib4PascalPackage.pas

@@ -118,7 +118,10 @@ uses
   ClpISO10126d2Padding, ClpIISO10126d2Padding, ClpPkcs5S2ParametersGenerator, 
   ClpIPkcs5S2ParametersGenerator, ClpIPbeParametersGenerator, 
   ClpPbeParametersGenerator, ClpHMac, ClpMiscObjectIdentifiers, 
-  ClpIanaObjectIdentifiers, ClpMacUtilities, ClpIMac, ClpIHMac;
+  ClpIanaObjectIdentifiers, ClpMacUtilities, ClpIMac, ClpIHMac, 
+  ClpIECSchnorrLIBSECPSigner, ClpIECSchnorrISOXSigner, ClpIECSchnorrISOSigner, 
+  ClpIECSchnorrBSISigner, ClpISchnorr, ClpECSchnorrLIBSECPSigner, 
+  ClpECSchnorrISOXSigner, ClpECSchnorrISOSigner, ClpECSchnorrBSISigner;
 
 implementation
 

+ 102 - 73
CryptoLib/src/Security/ClpSignerUtilities.pas

@@ -29,6 +29,14 @@ uses
   ClpDigestUtilities,
   ClpDsaDigestSigner,
   ClpECSchnorrSigner,
+  ClpECSchnorrBSISigner,
+  ClpIECSchnorrBSISigner,
+  ClpECSchnorrISOSigner,
+  ClpIECSchnorrISOSigner,
+  ClpECSchnorrISOXSigner,
+  ClpIECSchnorrISOXSigner,
+  ClpECSchnorrLIBSECPSigner,
+  ClpIECSchnorrLIBSECPSigner,
   ClpX9ObjectIdentifiers,
   ClpTeleTrusTObjectIdentifiers,
   ClpCryptoProObjectIdentifiers,
@@ -256,46 +264,46 @@ begin
   Falgorithms.Add('ECSCHNORRISOWITHRIPEMD160', 'RIPEMD160withECSCHNORRISO');
   Falgorithms.Add('RIPEMD160WITHECSCHNORRISO', 'RIPEMD160withECSCHNORRISO');
 
-  // ECSCHNORR ISOx
-
-  Falgorithms.Add('SHA1/ECSCHNORR/ISOx', 'SHA-1withECSCHNORRISOx');
-  Falgorithms.Add('SHA-1/ECSCHNORR/ISOx', 'SHA-1withECSCHNORRISOx');
-  Falgorithms.Add('ECSCHNORRISOxWITHSHA1', 'SHA-1withECSCHNORRISOx');
-  Falgorithms.Add('ECSCHNORRISOxWITHSHA-1', 'SHA-1withECSCHNORRISOx');
-  Falgorithms.Add('SHA1WITHECSCHNORRISOx', 'SHA-1withECSCHNORRISOx');
-  Falgorithms.Add('SHA-1WITHECSCHNORRISOx', 'SHA-1withECSCHNORRISOx');
-
-  Falgorithms.Add('SHA224/ECSCHNORR/ISOx', 'SHA-224withECSCHNORRISOx');
-  Falgorithms.Add('SHA-224/ECSCHNORR/ISOx', 'SHA-224withECSCHNORRISOx');
-  Falgorithms.Add('ECSCHNORRISOxWITHSHA224', 'SHA-224withECSCHNORRISOx');
-  Falgorithms.Add('ECSCHNORRISOxWITHSHA-224', 'SHA-224withECSCHNORRISOx');
-  Falgorithms.Add('SHA224WITHECSCHNORRISOx', 'SHA-224withECSCHNORRISOx');
-  Falgorithms.Add('SHA-224WITHECSCHNORRISOx', 'SHA-224withECSCHNORRISOx');
-
-  Falgorithms.Add('SHA256/ECSCHNORR/ISOx', 'SHA-256withECSCHNORRISOx');
-  Falgorithms.Add('SHA-256/ECSCHNORR/ISOx', 'SHA-256withECSCHNORRISOx');
-  Falgorithms.Add('ECSCHNORRISOxWITHSHA256', 'SHA-256withECSCHNORRISOx');
-  Falgorithms.Add('ECSCHNORRISOxWITHSHA-256', 'SHA-256withECSCHNORRISOx');
-  Falgorithms.Add('SHA256WITHECSCHNORRISOx', 'SHA-256withECSCHNORRISOx');
-  Falgorithms.Add('SHA-256WITHECSCHNORRISOx', 'SHA-256withECSCHNORRISOx');
-
-  Falgorithms.Add('SHA384/ECSCHNORR/ISOx', 'SHA-384withECSCHNORRISOx');
-  Falgorithms.Add('SHA-384/ECSCHNORR/ISOx', 'SHA-384withECSCHNORRISOx');
-  Falgorithms.Add('ECSCHNORRISOxWITHSHA384', 'SHA-384withECSCHNORRISOx');
-  Falgorithms.Add('ECSCHNORRISOxWITHSHA-384', 'SHA-384withECSCHNORRISOx');
-  Falgorithms.Add('SHA384WITHECSCHNORRISOx', 'SHA-384withECSCHNORRISOx');
-  Falgorithms.Add('SHA-384WITHECSCHNORRISOx', 'SHA-384withECSCHNORRISOx');
-
-  Falgorithms.Add('SHA512/ECSCHNORR/ISOx', 'SHA-512withECSCHNORRISOx');
-  Falgorithms.Add('SHA-512/ECSCHNORR/ISOx', 'SHA-512withECSCHNORRISOx');
-  Falgorithms.Add('ECSCHNORRISOxWITHSHA512', 'SHA-512withECSCHNORRISOx');
-  Falgorithms.Add('ECSCHNORRISOxWITHSHA-512', 'SHA-512withECSCHNORRISOx');
-  Falgorithms.Add('SHA512WITHECSCHNORRISOx', 'SHA-512withECSCHNORRISOx');
-  Falgorithms.Add('SHA-512WITHECSCHNORRISOx', 'SHA-512withECSCHNORRISOx');
-
-  Falgorithms.Add('RIPEMD160/ECSCHNORR/ISOx', 'RIPEMD160withECSCHNORRISOx');
-  Falgorithms.Add('ECSCHNORRISOxWITHRIPEMD160', 'RIPEMD160withECSCHNORRISOx');
-  Falgorithms.Add('RIPEMD160WITHECSCHNORRISOx', 'RIPEMD160withECSCHNORRISOx');
+  // ECSCHNORR ISOX
+
+  Falgorithms.Add('SHA1/ECSCHNORR/ISOX', 'SHA-1withECSCHNORRISOX');
+  Falgorithms.Add('SHA-1/ECSCHNORR/ISOX', 'SHA-1withECSCHNORRISOX');
+  Falgorithms.Add('ECSCHNORRISOXWITHSHA1', 'SHA-1withECSCHNORRISOX');
+  Falgorithms.Add('ECSCHNORRISOXWITHSHA-1', 'SHA-1withECSCHNORRISOX');
+  Falgorithms.Add('SHA1WITHECSCHNORRISOX', 'SHA-1withECSCHNORRISOX');
+  Falgorithms.Add('SHA-1WITHECSCHNORRISOX', 'SHA-1withECSCHNORRISOX');
+
+  Falgorithms.Add('SHA224/ECSCHNORR/ISOX', 'SHA-224withECSCHNORRISOX');
+  Falgorithms.Add('SHA-224/ECSCHNORR/ISOX', 'SHA-224withECSCHNORRISOX');
+  Falgorithms.Add('ECSCHNORRISOXWITHSHA224', 'SHA-224withECSCHNORRISOX');
+  Falgorithms.Add('ECSCHNORRISOXWITHSHA-224', 'SHA-224withECSCHNORRISOX');
+  Falgorithms.Add('SHA224WITHECSCHNORRISOX', 'SHA-224withECSCHNORRISOX');
+  Falgorithms.Add('SHA-224WITHECSCHNORRISOX', 'SHA-224withECSCHNORRISOX');
+
+  Falgorithms.Add('SHA256/ECSCHNORR/ISOX', 'SHA-256withECSCHNORRISOX');
+  Falgorithms.Add('SHA-256/ECSCHNORR/ISOX', 'SHA-256withECSCHNORRISOX');
+  Falgorithms.Add('ECSCHNORRISOXWITHSHA256', 'SHA-256withECSCHNORRISOX');
+  Falgorithms.Add('ECSCHNORRISOXWITHSHA-256', 'SHA-256withECSCHNORRISOX');
+  Falgorithms.Add('SHA256WITHECSCHNORRISOX', 'SHA-256withECSCHNORRISOX');
+  Falgorithms.Add('SHA-256WITHECSCHNORRISOX', 'SHA-256withECSCHNORRISOX');
+
+  Falgorithms.Add('SHA384/ECSCHNORR/ISOX', 'SHA-384withECSCHNORRISOX');
+  Falgorithms.Add('SHA-384/ECSCHNORR/ISOX', 'SHA-384withECSCHNORRISOX');
+  Falgorithms.Add('ECSCHNORRISOXWITHSHA384', 'SHA-384withECSCHNORRISOX');
+  Falgorithms.Add('ECSCHNORRISOXWITHSHA-384', 'SHA-384withECSCHNORRISOX');
+  Falgorithms.Add('SHA384WITHECSCHNORRISOX', 'SHA-384withECSCHNORRISOX');
+  Falgorithms.Add('SHA-384WITHECSCHNORRISOX', 'SHA-384withECSCHNORRISOX');
+
+  Falgorithms.Add('SHA512/ECSCHNORR/ISOX', 'SHA-512withECSCHNORRISOX');
+  Falgorithms.Add('SHA-512/ECSCHNORR/ISOX', 'SHA-512withECSCHNORRISOX');
+  Falgorithms.Add('ECSCHNORRISOXWITHSHA512', 'SHA-512withECSCHNORRISOX');
+  Falgorithms.Add('ECSCHNORRISOXWITHSHA-512', 'SHA-512withECSCHNORRISOX');
+  Falgorithms.Add('SHA512WITHECSCHNORRISOX', 'SHA-512withECSCHNORRISOX');
+  Falgorithms.Add('SHA-512WITHECSCHNORRISOX', 'SHA-512withECSCHNORRISOX');
+
+  Falgorithms.Add('RIPEMD160/ECSCHNORR/ISOX', 'RIPEMD160withECSCHNORRISOX');
+  Falgorithms.Add('ECSCHNORRISOXWITHRIPEMD160', 'RIPEMD160withECSCHNORRISOX');
+  Falgorithms.Add('RIPEMD160WITHECSCHNORRISOX', 'RIPEMD160withECSCHNORRISOX');
 
 
   // ECSCHNORR LIBSECP
@@ -461,42 +469,44 @@ begin
     Exit;
   end;
 
-
-  //
-
   if (mechanism = 'SHA-1withECSCHNORRBSI') then
   begin
     DigestInstance := TDigestUtilities.GetDigest('SHA-1');
 
-    Result := TECSchnorrSigner.Create(DigestInstance, 'BSI');
+    Result := TECSchnorrSigner.Create(TECSchnorrBSISigner.Create()
+      as IECSchnorrBSISigner, DigestInstance);
     Exit;
   end;
   if (mechanism = 'SHA-224withECSCHNORRBSI') then
   begin
     DigestInstance := TDigestUtilities.GetDigest('SHA-224');
 
-    Result := TECSchnorrSigner.Create(DigestInstance, 'BSI');
+    Result := TECSchnorrSigner.Create(TECSchnorrBSISigner.Create()
+      as IECSchnorrBSISigner, DigestInstance);
     Exit;
   end;
   if (mechanism = 'SHA-256withECSCHNORRBSI') then
   begin
     DigestInstance := TDigestUtilities.GetDigest('SHA-256');
 
-    Result := TECSchnorrSigner.Create(DigestInstance, 'BSI');
+    Result := TECSchnorrSigner.Create(TECSchnorrBSISigner.Create()
+      as IECSchnorrBSISigner, DigestInstance);
     Exit;
   end;
   if (mechanism = 'SHA-384withECSCHNORRBSI') then
   begin
     DigestInstance := TDigestUtilities.GetDigest('SHA-384');
 
-    Result := TECSchnorrSigner.Create(DigestInstance, 'BSI');
+    Result := TECSchnorrSigner.Create(TECSchnorrBSISigner.Create()
+      as IECSchnorrBSISigner, DigestInstance);
     Exit;
   end;
   if (mechanism = 'SHA-512withECSCHNORRBSI') then
   begin
     DigestInstance := TDigestUtilities.GetDigest('SHA-512');
 
-    Result := TECSchnorrSigner.Create(DigestInstance, 'BSI');
+    Result := TECSchnorrSigner.Create(TECSchnorrBSISigner.Create()
+      as IECSchnorrBSISigner, DigestInstance);
     Exit;
   end;
 
@@ -504,7 +514,8 @@ begin
   begin
     DigestInstance := TDigestUtilities.GetDigest('RIPEMD-160');
 
-    Result := TECSchnorrSigner.Create(DigestInstance, 'BSI');
+    Result := TECSchnorrSigner.Create(TECSchnorrBSISigner.Create()
+      as IECSchnorrBSISigner, DigestInstance);
     Exit;
   end;
 
@@ -514,35 +525,40 @@ begin
   begin
     DigestInstance := TDigestUtilities.GetDigest('SHA-1');
 
-    Result := TECSchnorrSigner.Create(DigestInstance, 'ISO');
+    Result := TECSchnorrSigner.Create(TECSchnorrISOSigner.Create()
+      as IECSchnorrISOSigner, DigestInstance);
     Exit;
   end;
   if (mechanism = 'SHA-224withECSCHNORRISO') then
   begin
     DigestInstance := TDigestUtilities.GetDigest('SHA-224');
 
-    Result := TECSchnorrSigner.Create(DigestInstance, 'ISO');
+    Result := TECSchnorrSigner.Create(TECSchnorrISOSigner.Create()
+      as IECSchnorrISOSigner, DigestInstance);
     Exit;
   end;
   if (mechanism = 'SHA-256withECSCHNORRISO') then
   begin
     DigestInstance := TDigestUtilities.GetDigest('SHA-256');
 
-    Result := TECSchnorrSigner.Create(DigestInstance, 'ISO');
+    Result := TECSchnorrSigner.Create(TECSchnorrISOSigner.Create()
+      as IECSchnorrISOSigner, DigestInstance);
     Exit;
   end;
   if (mechanism = 'SHA-384withECSCHNORRISO') then
   begin
     DigestInstance := TDigestUtilities.GetDigest('SHA-384');
 
-    Result := TECSchnorrSigner.Create(DigestInstance, 'ISO');
+    Result := TECSchnorrSigner.Create(TECSchnorrISOSigner.Create()
+      as IECSchnorrISOSigner, DigestInstance);
     Exit;
   end;
   if (mechanism = 'SHA-512withECSCHNORRISO') then
   begin
     DigestInstance := TDigestUtilities.GetDigest('SHA-512');
 
-    Result := TECSchnorrSigner.Create(DigestInstance, 'ISO');
+    Result := TECSchnorrSigner.Create(TECSchnorrISOSigner.Create()
+      as IECSchnorrISOSigner, DigestInstance);
     Exit;
   end;
 
@@ -550,53 +566,60 @@ begin
   begin
     DigestInstance := TDigestUtilities.GetDigest('RIPEMD-160');
 
-    Result := TECSchnorrSigner.Create(DigestInstance, 'ISO');
+    Result := TECSchnorrSigner.Create(TECSchnorrISOSigner.Create()
+      as IECSchnorrISOSigner, DigestInstance);
     Exit;
   end;
 
   //
 
-  if (CompareText(mechanism, 'SHA-1withECSCHNORRISOx') = 0) then
+  if (mechanism = 'SHA-1withECSCHNORRISOX') then
   begin
     DigestInstance := TDigestUtilities.GetDigest('SHA-1');
 
-    Result := TECSchnorrSigner.Create(DigestInstance, 'ISOx');
+    Result := TECSchnorrSigner.Create(TECSchnorrISOXSigner.Create()
+      as IECSchnorrISOXSigner, DigestInstance);
     Exit;
   end;
-  if (CompareText(mechanism, 'SHA-224withECSCHNORRISOx') = 0) then
+  if (mechanism = 'SHA-224withECSCHNORRISOX') then
   begin
     DigestInstance := TDigestUtilities.GetDigest('SHA-224');
 
-    Result := TECSchnorrSigner.Create(DigestInstance, 'ISOx');
+    Result := TECSchnorrSigner.Create(TECSchnorrISOXSigner.Create()
+      as IECSchnorrISOXSigner, DigestInstance);
     Exit;
   end;
-  if (CompareText(mechanism, 'SHA-256withECSCHNORRISOx') = 0) then
+  if (mechanism = 'SHA-256withECSCHNORRISOX') then
   begin
     DigestInstance := TDigestUtilities.GetDigest('SHA-256');
 
-    Result := TECSchnorrSigner.Create(DigestInstance, 'ISOx');
+    Result := TECSchnorrSigner.Create(TECSchnorrISOXSigner.Create()
+      as IECSchnorrISOXSigner, DigestInstance);
     Exit;
   end;
-  if (CompareText(mechanism, 'SHA-384withECSCHNORRISOx') = 0) then
+  if (mechanism = 'SHA-384withECSCHNORRISOX') then
   begin
     DigestInstance := TDigestUtilities.GetDigest('SHA-384');
 
-    Result := TECSchnorrSigner.Create(DigestInstance, 'ISOx');
+    Result := TECSchnorrSigner.Create(TECSchnorrISOXSigner.Create()
+      as IECSchnorrISOXSigner, DigestInstance);
     Exit;
   end;
-  if (CompareText(mechanism, 'SHA-512withECSCHNORRISOx') = 0) then
+  if (mechanism = 'SHA-512withECSCHNORRISOX') then
   begin
     DigestInstance := TDigestUtilities.GetDigest('SHA-512');
 
-    Result := TECSchnorrSigner.Create(DigestInstance, 'ISOx');
+    Result := TECSchnorrSigner.Create(TECSchnorrISOXSigner.Create()
+      as IECSchnorrISOXSigner, DigestInstance);
     Exit;
   end;
 
-  if (CompareText(mechanism, 'RIPEMD160withECSCHNORRISOx') = 0) then
+  if (mechanism = 'RIPEMD160withECSCHNORRISOX') then
   begin
     DigestInstance := TDigestUtilities.GetDigest('RIPEMD-160');
 
-    Result := TECSchnorrSigner.Create(DigestInstance, 'ISOx');
+    Result := TECSchnorrSigner.Create(TECSchnorrISOXSigner.Create()
+      as IECSchnorrISOXSigner, DigestInstance);
     Exit;
   end;
 
@@ -606,35 +629,40 @@ begin
   begin
     DigestInstance := TDigestUtilities.GetDigest('SHA-1');
 
-    Result := TECSchnorrSigner.Create(DigestInstance, 'LIBSECP');
+    Result := TECSchnorrSigner.Create(TECSchnorrLIBSECPSigner.Create()
+      as IECSchnorrLIBSECPSigner, DigestInstance);
     Exit;
   end;
   if (mechanism = 'SHA-224withECSCHNORRLIBSECP') then
   begin
     DigestInstance := TDigestUtilities.GetDigest('SHA-224');
 
-    Result := TECSchnorrSigner.Create(DigestInstance, 'LIBSECP');
+    Result := TECSchnorrSigner.Create(TECSchnorrLIBSECPSigner.Create()
+      as IECSchnorrLIBSECPSigner, DigestInstance);
     Exit;
   end;
   if (mechanism = 'SHA-256withECSCHNORRLIBSECP') then
   begin
     DigestInstance := TDigestUtilities.GetDigest('SHA-256');
 
-    Result := TECSchnorrSigner.Create(DigestInstance, 'LIBSECP');
+    Result := TECSchnorrSigner.Create(TECSchnorrLIBSECPSigner.Create()
+      as IECSchnorrLIBSECPSigner, DigestInstance);
     Exit;
   end;
   if (mechanism = 'SHA-384withECSCHNORRLIBSECP') then
   begin
     DigestInstance := TDigestUtilities.GetDigest('SHA-384');
 
-    Result := TECSchnorrSigner.Create(DigestInstance, 'LIBSECP');
+    Result := TECSchnorrSigner.Create(TECSchnorrLIBSECPSigner.Create()
+      as IECSchnorrLIBSECPSigner, DigestInstance);
     Exit;
   end;
   if (mechanism = 'SHA-512withECSCHNORRLIBSECP') then
   begin
     DigestInstance := TDigestUtilities.GetDigest('SHA-512');
 
-    Result := TECSchnorrSigner.Create(DigestInstance, 'LIBSECP');
+    Result := TECSchnorrSigner.Create(TECSchnorrLIBSECPSigner.Create()
+      as IECSchnorrLIBSECPSigner, DigestInstance);
     Exit;
   end;
 
@@ -642,7 +670,8 @@ begin
   begin
     DigestInstance := TDigestUtilities.GetDigest('RIPEMD-160');
 
-    Result := TECSchnorrSigner.Create(DigestInstance, 'LIBSECP');
+    Result := TECSchnorrSigner.Create(TECSchnorrLIBSECPSigner.Create()
+      as IECSchnorrLIBSECPSigner, DigestInstance);
     Exit;
   end;