Browse Source

- Refactoring of Schnorr Module.

- add EC-Schnorr variant by Sipa (https://github.com/sipa/bips/blob/bip-schnorr/bip-schnorr.mediawiki)
-  remove other EC-Schnorr variants
- refactoring of SignerUtilities
- fix Encoding bug in DerT61String on Linux.
- update README
Ugochukwu Mmaduekwe 7 years ago
parent
commit
e619bfa433
28 changed files with 1482 additions and 2033 deletions
  1. 10 12
      CryptoLib.Samples/Delphi.Samples/UsageSamples.dpr
  2. 1 2
      CryptoLib.Samples/src/UsageExamples.pas
  3. 10 12
      CryptoLib.Tests/Delphi.Tests/CryptoLib.Tests.dpr
  4. 2 2
      CryptoLib.Tests/src/Asn1/StringTests.pas
  5. 0 1
      CryptoLib.Tests/src/Math/EC/Custom/Sec/SecP384R1FieldTests.pas
  6. 197 153
      CryptoLib.Tests/src/Others/ECSchnorrTests.pas
  7. 20 2
      CryptoLib/src/Asn1/ClpDerT61String.pas
  8. 4 5
      CryptoLib/src/Crypto/Signers/ClpDsaDigestSigner.pas
  9. 0 151
      CryptoLib/src/Crypto/Signers/ClpECSchnorrBSISigner.pas
  10. 0 155
      CryptoLib/src/Crypto/Signers/ClpECSchnorrISOSigner.pas
  11. 0 151
      CryptoLib/src/Crypto/Signers/ClpECSchnorrISOXSigner.pas
  12. 0 161
      CryptoLib/src/Crypto/Signers/ClpECSchnorrLIBSECPSigner.pas
  13. 0 364
      CryptoLib/src/Crypto/Signers/ClpECSchnorrSigner.pas
  14. 292 0
      CryptoLib/src/Crypto/Signers/ClpECSchnorrSipaSigner.pas
  15. 0 1
      CryptoLib/src/Crypto/Signers/ClpPlainDsaEncoding.pas
  16. 139 0
      CryptoLib/src/Crypto/Signers/ClpPlainSchnorrEncoding.pas
  17. 254 0
      CryptoLib/src/Crypto/Signers/ClpSchnorrDigestSigner.pas
  18. 0 35
      CryptoLib/src/Interfaces/ClpIECSchnorrLIBSECPSigner.pas
  19. 4 4
      CryptoLib/src/Interfaces/ClpIECSchnorrSipaSigner.pas
  20. 17 4
      CryptoLib/src/Interfaces/ClpIPlainSchnorrEncoding.pas
  21. 12 9
      CryptoLib/src/Interfaces/ClpISchnorr.pas
  22. 8 4
      CryptoLib/src/Interfaces/ClpISchnorrDigestSigner.pas
  23. 52 0
      CryptoLib/src/Interfaces/ClpISchnorrEncoding.pas
  24. 13 14
      CryptoLib/src/Interfaces/ClpISchnorrExt.pas
  25. 382 390
      CryptoLib/src/Packages/FPC/CryptoLib4PascalPackage.lpk
  26. 11 12
      CryptoLib/src/Packages/FPC/CryptoLib4PascalPackage.pas
  27. 50 377
      CryptoLib/src/Security/ClpSignerUtilities.pas
  28. 4 12
      README.md

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

@@ -276,8 +276,6 @@ uses
   ClpBerSequenceGenerator in '..\..\CryptoLib\src\Asn1\ClpBerSequenceGenerator.pas',
   ClpBerSequenceGenerator in '..\..\CryptoLib\src\Asn1\ClpBerSequenceGenerator.pas',
   ClpSetWeakRef in '..\..\CryptoLib\src\Utils\ClpSetWeakRef.pas',
   ClpSetWeakRef in '..\..\CryptoLib\src\Utils\ClpSetWeakRef.pas',
   UsageExamples in '..\src\UsageExamples.pas',
   UsageExamples in '..\src\UsageExamples.pas',
-  ClpIECSchnorrSigner in '..\..\CryptoLib\src\Interfaces\ClpIECSchnorrSigner.pas',
-  ClpECSchnorrSigner in '..\..\CryptoLib\src\Crypto\Signers\ClpECSchnorrSigner.pas',
   ClpCipherUtilities in '..\..\CryptoLib\src\Security\ClpCipherUtilities.pas',
   ClpCipherUtilities in '..\..\CryptoLib\src\Security\ClpCipherUtilities.pas',
   ClpIBufferedCipher in '..\..\CryptoLib\src\Interfaces\ClpIBufferedCipher.pas',
   ClpIBufferedCipher in '..\..\CryptoLib\src\Interfaces\ClpIBufferedCipher.pas',
   ClpIBlockCipher in '..\..\CryptoLib\src\Interfaces\ClpIBlockCipher.pas',
   ClpIBlockCipher in '..\..\CryptoLib\src\Interfaces\ClpIBlockCipher.pas',
@@ -365,15 +363,6 @@ uses
   ClpIPbeParametersGenerator in '..\..\CryptoLib\src\Interfaces\ClpIPbeParametersGenerator.pas',
   ClpIPbeParametersGenerator in '..\..\CryptoLib\src\Interfaces\ClpIPbeParametersGenerator.pas',
   ClpPkcs5S2ParametersGenerator in '..\..\CryptoLib\src\Crypto\Generators\ClpPkcs5S2ParametersGenerator.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',
   ClpECNRSigner in '..\..\CryptoLib\src\Crypto\Signers\ClpECNRSigner.pas',
   ClpECNRSigner in '..\..\CryptoLib\src\Crypto\Signers\ClpECNRSigner.pas',
   ClpIECNRSigner in '..\..\CryptoLib\src\Interfaces\ClpIECNRSigner.pas',
   ClpIECNRSigner in '..\..\CryptoLib\src\Interfaces\ClpIECNRSigner.pas',
   ClpDsaValidationParameters in '..\..\CryptoLib\src\Crypto\Parameters\ClpDsaValidationParameters.pas',
   ClpDsaValidationParameters in '..\..\CryptoLib\src\Crypto\Parameters\ClpDsaValidationParameters.pas',
@@ -463,7 +452,16 @@ uses
   ClpIPlainDsaEncoding in '..\..\CryptoLib\src\Interfaces\ClpIPlainDsaEncoding.pas',
   ClpIPlainDsaEncoding in '..\..\CryptoLib\src\Interfaces\ClpIPlainDsaEncoding.pas',
   ClpPlainDsaEncoding in '..\..\CryptoLib\src\Crypto\Signers\ClpPlainDsaEncoding.pas',
   ClpPlainDsaEncoding in '..\..\CryptoLib\src\Crypto\Signers\ClpPlainDsaEncoding.pas',
   ClpBsiObjectIdentifiers in '..\..\CryptoLib\src\Asn1\Bsi\ClpBsiObjectIdentifiers.pas',
   ClpBsiObjectIdentifiers in '..\..\CryptoLib\src\Asn1\Bsi\ClpBsiObjectIdentifiers.pas',
-  ClpEacObjectIdentifiers in '..\..\CryptoLib\src\Asn1\Eac\ClpEacObjectIdentifiers.pas';
+  ClpEacObjectIdentifiers in '..\..\CryptoLib\src\Asn1\Eac\ClpEacObjectIdentifiers.pas',
+  ClpSchnorrDigestSigner in '..\..\CryptoLib\src\Crypto\Signers\ClpSchnorrDigestSigner.pas',
+  ClpISchnorrDigestSigner in '..\..\CryptoLib\src\Interfaces\ClpISchnorrDigestSigner.pas',
+  ClpISchnorr in '..\..\CryptoLib\src\Interfaces\ClpISchnorr.pas',
+  ClpECSchnorrSipaSigner in '..\..\CryptoLib\src\Crypto\Signers\ClpECSchnorrSipaSigner.pas',
+  ClpIECSchnorrSipaSigner in '..\..\CryptoLib\src\Interfaces\ClpIECSchnorrSipaSigner.pas',
+  ClpISchnorrExt in '..\..\CryptoLib\src\Interfaces\ClpISchnorrExt.pas',
+  ClpISchnorrEncoding in '..\..\CryptoLib\src\Interfaces\ClpISchnorrEncoding.pas',
+  ClpIPlainSchnorrEncoding in '..\..\CryptoLib\src\Interfaces\ClpIPlainSchnorrEncoding.pas',
+  ClpPlainSchnorrEncoding in '..\..\CryptoLib\src\Crypto\Signers\ClpPlainSchnorrEncoding.pas';
 
 
 begin
 begin
   try
   try

+ 1 - 2
CryptoLib.Samples/src/UsageExamples.pas

@@ -48,7 +48,6 @@ uses
   ClpECPublicKeyParameters,
   ClpECPublicKeyParameters,
   ClpECPrivateKeyParameters,
   ClpECPrivateKeyParameters,
   ClpIAsymmetricKeyParameter,
   ClpIAsymmetricKeyParameter,
-  ClpECSchnorrSigner,
   ClpIECInterface,
   ClpIECInterface,
   ClpECPoint,
   ClpECPoint,
   ClpISigner,
   ClpISigner,
@@ -104,7 +103,7 @@ type
     /// SHA-512withECDSA and RIPEMD160withECDSA
     /// SHA-512withECDSA and RIPEMD160withECDSA
     /// </summary>
     /// </summary>
     SigningAlgorithmECDSA = 'SHA-1withECDSA';
     SigningAlgorithmECDSA = 'SHA-1withECDSA';
-    SigningAlgorithmECSCHNORR = 'SHA-256withECSCHNORRLIBSECP';
+    SigningAlgorithmECSCHNORR = 'SHA-256withECSCHNORRSIPA';
 
 
     PKCS5_SALT_LEN = Int32(8);
     PKCS5_SALT_LEN = Int32(8);
     SALT_MAGIC_LEN = Int32(8);
     SALT_MAGIC_LEN = Int32(8);

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

@@ -302,8 +302,6 @@ uses
   ClpIBerSequenceGenerator in '..\..\CryptoLib\src\Interfaces\ClpIBerSequenceGenerator.pas',
   ClpIBerSequenceGenerator in '..\..\CryptoLib\src\Interfaces\ClpIBerSequenceGenerator.pas',
   ClpBerSequenceGenerator in '..\..\CryptoLib\src\Asn1\ClpBerSequenceGenerator.pas',
   ClpBerSequenceGenerator in '..\..\CryptoLib\src\Asn1\ClpBerSequenceGenerator.pas',
   ClpSetWeakRef in '..\..\CryptoLib\src\Utils\ClpSetWeakRef.pas',
   ClpSetWeakRef in '..\..\CryptoLib\src\Utils\ClpSetWeakRef.pas',
-  ClpECSchnorrSigner in '..\..\CryptoLib\src\Crypto\Signers\ClpECSchnorrSigner.pas',
-  ClpIECSchnorrSigner in '..\..\CryptoLib\src\Interfaces\ClpIECSchnorrSigner.pas',
   ECSchnorrTests in '..\src\Others\ECSchnorrTests.pas',
   ECSchnorrTests in '..\src\Others\ECSchnorrTests.pas',
   DigestRandomNumberTests in '..\src\Crypto\DigestRandomNumberTests.pas',
   DigestRandomNumberTests in '..\src\Crypto\DigestRandomNumberTests.pas',
   FixedPointTests in '..\src\Math\EC\FixedPointTests.pas',
   FixedPointTests in '..\src\Math\EC\FixedPointTests.pas',
@@ -403,15 +401,6 @@ uses
   ClpIPkcs5S2ParametersGenerator in '..\..\CryptoLib\src\Interfaces\ClpIPkcs5S2ParametersGenerator.pas',
   ClpIPkcs5S2ParametersGenerator in '..\..\CryptoLib\src\Interfaces\ClpIPkcs5S2ParametersGenerator.pas',
   Pkcs5Tests in '..\src\Crypto\Pkcs5Tests.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',
   ClpECNRSigner in '..\..\CryptoLib\src\Crypto\Signers\ClpECNRSigner.pas',
   ClpECNRSigner in '..\..\CryptoLib\src\Crypto\Signers\ClpECNRSigner.pas',
   ClpIECNRSigner in '..\..\CryptoLib\src\Interfaces\ClpIECNRSigner.pas',
   ClpIECNRSigner in '..\..\CryptoLib\src\Interfaces\ClpIECNRSigner.pas',
   ClpDsaValidationParameters in '..\..\CryptoLib\src\Crypto\Parameters\ClpDsaValidationParameters.pas',
   ClpDsaValidationParameters in '..\..\CryptoLib\src\Crypto\Parameters\ClpDsaValidationParameters.pas',
@@ -521,7 +510,16 @@ uses
   ClpIPlainDsaEncoding in '..\..\CryptoLib\src\Interfaces\ClpIPlainDsaEncoding.pas',
   ClpIPlainDsaEncoding in '..\..\CryptoLib\src\Interfaces\ClpIPlainDsaEncoding.pas',
   ClpPlainDsaEncoding in '..\..\CryptoLib\src\Crypto\Signers\ClpPlainDsaEncoding.pas',
   ClpPlainDsaEncoding in '..\..\CryptoLib\src\Crypto\Signers\ClpPlainDsaEncoding.pas',
   ClpBsiObjectIdentifiers in '..\..\CryptoLib\src\Asn1\Bsi\ClpBsiObjectIdentifiers.pas',
   ClpBsiObjectIdentifiers in '..\..\CryptoLib\src\Asn1\Bsi\ClpBsiObjectIdentifiers.pas',
-  ClpEacObjectIdentifiers in '..\..\CryptoLib\src\Asn1\Eac\ClpEacObjectIdentifiers.pas';
+  ClpEacObjectIdentifiers in '..\..\CryptoLib\src\Asn1\Eac\ClpEacObjectIdentifiers.pas',
+  ClpSchnorrDigestSigner in '..\..\CryptoLib\src\Crypto\Signers\ClpSchnorrDigestSigner.pas',
+  ClpISchnorrDigestSigner in '..\..\CryptoLib\src\Interfaces\ClpISchnorrDigestSigner.pas',
+  ClpISchnorr in '..\..\CryptoLib\src\Interfaces\ClpISchnorr.pas',
+  ClpECSchnorrSipaSigner in '..\..\CryptoLib\src\Crypto\Signers\ClpECSchnorrSipaSigner.pas',
+  ClpIECSchnorrSipaSigner in '..\..\CryptoLib\src\Interfaces\ClpIECSchnorrSipaSigner.pas',
+  ClpISchnorrExt in '..\..\CryptoLib\src\Interfaces\ClpISchnorrExt.pas',
+  ClpISchnorrEncoding in '..\..\CryptoLib\src\Interfaces\ClpISchnorrEncoding.pas',
+  ClpIPlainSchnorrEncoding in '..\..\CryptoLib\src\Interfaces\ClpIPlainSchnorrEncoding.pas',
+  ClpPlainSchnorrEncoding in '..\..\CryptoLib\src\Crypto\Signers\ClpPlainSchnorrEncoding.pas';
 
 
 begin
 begin
 
 

+ 2 - 2
CryptoLib.Tests/src/Asn1/StringTests.pas

@@ -31,12 +31,12 @@ uses
 {$ELSE}
 {$ELSE}
   TestFramework,
   TestFramework,
 {$ENDIF FPC}
 {$ENDIF FPC}
+  ClpDerT61String,
+  ClpIDerT61String,
   ClpDerBitString,
   ClpDerBitString,
   ClpIDerBitString,
   ClpIDerBitString,
   ClpDerUniversalString,
   ClpDerUniversalString,
   ClpIDerUniversalString,
   ClpIDerUniversalString,
-  ClpDerT61String,
-  ClpIDerT61String,
   ClpConverters;
   ClpConverters;
 
 
 type
 type

+ 0 - 1
CryptoLib.Tests/src/Math/EC/Custom/Sec/SecP384R1FieldTests.pas

@@ -147,7 +147,6 @@ begin
   inherited;
   inherited;
   FRandom := TSecureRandom.Create();
   FRandom := TSecureRandom.Create();
   FDP := TCustomNamedCurves.GetByOid(TSecObjectIdentifiers.SecP384r1);
   FDP := TCustomNamedCurves.GetByOid(TSecObjectIdentifiers.SecP384r1);
-
   FQ := FDP.Curve.Field.Characteristic;
   FQ := FDP.Curve.Field.Characteristic;
 end;
 end;
 
 

+ 197 - 153
CryptoLib.Tests/src/Others/ECSchnorrTests.pas

@@ -24,7 +24,6 @@ interface
 {$ENDIF FPC}
 {$ENDIF FPC}
 
 
 uses
 uses
-  Classes,
   SysUtils,
   SysUtils,
 {$IFDEF FPC}
 {$IFDEF FPC}
   fpcunit,
   fpcunit,
@@ -34,7 +33,6 @@ uses
 {$ENDIF FPC}
 {$ENDIF FPC}
   ClpSecureRandom,
   ClpSecureRandom,
   ClpISecureRandom,
   ClpISecureRandom,
-  ClpFixedSecureRandom,
   ClpISigner,
   ClpISigner,
   ClpECPublicKeyParameters,
   ClpECPublicKeyParameters,
   ClpIECPublicKeyParameters,
   ClpIECPublicKeyParameters,
@@ -55,6 +53,8 @@ uses
   ClpCryptoLibTypes,
   ClpCryptoLibTypes,
   ClpBigInteger,
   ClpBigInteger,
   ClpSignerUtilities,
   ClpSignerUtilities,
+  ClpHex,
+  ClpArrayUtils,
   ClpConverters;
   ClpConverters;
 
 
 type
 type
@@ -73,17 +73,20 @@ type
 
 
   var
   var
     FRandom: ISecureRandom;
     FRandom: ISecureRandom;
+    FECSchnorrSipaSigningPassTestVector,
+      FECSchnorrSipaVerificationPassTestVector,
+      FECSchnorrSipaVerificationFailTestVector
+      : TCryptoLibGenericArray<TCryptoLibStringArray>;
 
 
   protected
   protected
     procedure SetUp; override;
     procedure SetUp; override;
     procedure TearDown; override;
     procedure TearDown; override;
   published
   published
 
 
-    procedure TestECSchnorrWithCustomK;
-    procedure TestECSchnorrBSI;
-    procedure TestECSchnorrISO;
-    procedure TestECSchnorrISOX;
-    procedure TestECSchnorrLIBSECP;
+    procedure TestECSchnorrSIPASigningShouldPass;
+    procedure TestECSchnorrSIPAVerificationShouldPass;
+    procedure TestECSchnorrSIPAVerificationShouldFail;
+    procedure TestECSchnorrSIPASigningandVerifyingSecp521R1;
 
 
   end;
   end;
 
 
@@ -95,6 +98,97 @@ procedure TTestECSchnorr.SetUp;
 begin
 begin
   inherited;
   inherited;
   FRandom := TSecureRandom.Create();
   FRandom := TSecureRandom.Create();
+  FECSchnorrSipaSigningPassTestVector :=
+    TCryptoLibGenericArray<TCryptoLibStringArray>.Create
+    (TCryptoLibStringArray.Create('Test vector 1',
+    '0000000000000000000000000000000000000000000000000000000000000001',
+    '0279BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798',
+    '0000000000000000000000000000000000000000000000000000000000000000',
+    '787A848E71043D280C50470E8E1532B2DD5D20EE912A45DBDD2BD1DFBF187EF67031A98831859DC34DFFEEDDA86831842CCD0079E1F92AF177F7F22CC1DCED05'),
+
+    TCryptoLibStringArray.Create('Test vector 2',
+    'B7E151628AED2A6ABF7158809CF4F3C762E7160F38B4DA56A784D9045190CFEF',
+    '02DFF1D77F2A671C5F36183726DB2341BE58FEAE1DA2DECED843240F7B502BA659',
+    '243F6A8885A308D313198A2E03707344A4093822299F31D0082EFA98EC4E6C89',
+    '2A298DACAE57395A15D0795DDBFD1DCB564DA82B0F269BC70A74F8220429BA1D1E51A22CCEC35599B8F266912281F8365FFC2D035A230434A1A64DC59F7013FD'),
+    TCryptoLibStringArray.Create('Test vector 3',
+    'C90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74020BBEA63B14E5C7',
+    '03FAC2114C2FBB091527EB7C64ECB11F8021CB45E8E7809D3C0938E4B8C0E5F84B',
+    '5E2D58D8B3BCDF1ABADEC7829054F90DDA9805AAB56C77333024B9D0A508B75C',
+    '00DA9B08172A9B6F0466A2DEFD817F2D7AB437E0D253CB5395A963866B3574BE00880371D01766935B92D2AB4CD5C8A2A5837EC57FED7660773A05F0DE142380')
+    );
+
+  FECSchnorrSipaVerificationPassTestVector :=
+    TCryptoLibGenericArray<TCryptoLibStringArray>.Create
+    (TCryptoLibStringArray.Create('Test vector 4A',
+    '03DEFDEA4CDB677750A420FEE807EACF21EB9898AE79B9768766E4FAA04A2D4A34',
+    '4DF3C3F68FCC83B27E9D42C90431A72499F17875C81A599B566C9889B9696703',
+    '00000000000000000000003B78CE563F89A0ED9414F5AA28AD0D96D6795F9C6302A8DC32E64E86A333F20EF56EAC9BA30B7246D6D25E22ADB8C6BE1AEB08D49D'),
+
+    TCryptoLibStringArray.Create('Test vector 4B',
+    '031B84C5567B126440995D3ED5AABA0565D71E1834604819FF9C17F5E9D5DD078F',
+    '0000000000000000000000000000000000000000000000000000000000000000',
+    '52818579ACA59767E3291D91B76B637BEF062083284992F2D95F564CA6CB4E3530B1DA849C8E8304ADC0CFE870660334B3CFC18E825EF1DB34CFAE3DFC5D8187')
+    );
+
+  FECSchnorrSipaVerificationFailTestVector :=
+    TCryptoLibGenericArray<TCryptoLibStringArray>.Create(
+
+    TCryptoLibStringArray.Create('Test vector 5',
+    '03EEFDEA4CDB677750A420FEE807EACF21EB9898AE79B9768766E4FAA04A2D4A34',
+    '4DF3C3F68FCC83B27E9D42C90431A72499F17875C81A599B566C9889B9696703',
+    '00000000000000000000003B78CE563F89A0ED9414F5AA28AD0D96D6795F9C6302A8DC32E64E86A333F20EF56EAC9BA30B7246D6D25E22ADB8C6BE1AEB08D49D',
+    'public key not on the curve'),
+
+    TCryptoLibStringArray.Create('Test vector 6',
+    '02DFF1D77F2A671C5F36183726DB2341BE58FEAE1DA2DECED843240F7B502BA659',
+    '243F6A8885A308D313198A2E03707344A4093822299F31D0082EFA98EC4E6C89',
+    '2A298DACAE57395A15D0795DDBFD1DCB564DA82B0F269BC70A74F8220429BA1DFA16AEE06609280A19B67A24E1977E4697712B5FD2943914ECD5F730901B4AB7',
+    'incorrect R residuosity'),
+
+    TCryptoLibStringArray.Create('Test vector 7',
+    '03FAC2114C2FBB091527EB7C64ECB11F8021CB45E8E7809D3C0938E4B8C0E5F84B',
+    '5E2D58D8B3BCDF1ABADEC7829054F90DDA9805AAB56C77333024B9D0A508B75C',
+    '00DA9B08172A9B6F0466A2DEFD817F2D7AB437E0D253CB5395A963866B3574BED092F9D860F1776A1F7412AD8A1EB50DACCC222BC8C0E26B2056DF2F273EFDEC',
+    'negated message hash'),
+
+    TCryptoLibStringArray.Create('Test vector 8',
+    '0279BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798',
+    '0000000000000000000000000000000000000000000000000000000000000000',
+    '787A848E71043D280C50470E8E1532B2DD5D20EE912A45DBDD2BD1DFBF187EF68FCE5677CE7A623CB20011225797CE7A8DE1DC6CCD4F754A47DA6C600E59543C',
+    'negated s value'),
+
+    TCryptoLibStringArray.Create('Test vector 9',
+    '03DFF1D77F2A671C5F36183726DB2341BE58FEAE1DA2DECED843240F7B502BA659',
+    '243F6A8885A308D313198A2E03707344A4093822299F31D0082EFA98EC4E6C89',
+    '2A298DACAE57395A15D0795DDBFD1DCB564DA82B0F269BC70A74F8220429BA1D1E51A22CCEC35599B8F266912281F8365FFC2D035A230434A1A64DC59F7013FD',
+    'negated public key'),
+
+    TCryptoLibStringArray.Create('Test vector 10',
+    '02DFF1D77F2A671C5F36183726DB2341BE58FEAE1DA2DECED843240F7B502BA659',
+    '243F6A8885A308D313198A2E03707344A4093822299F31D0082EFA98EC4E6C89',
+    '2A298DACAE57395A15D0795DDBFD1DCB564DA82B0F269BC70A74F8220429BA1D8C3428869A663ED1E954705B020CBB3E7BB6AC31965B9EA4C73E227B17C5AF5A',
+    'sG - eP is infinite'),
+
+    TCryptoLibStringArray.Create('Test vector 11',
+    '02DFF1D77F2A671C5F36183726DB2341BE58FEAE1DA2DECED843240F7B502BA659',
+    '243F6A8885A308D313198A2E03707344A4093822299F31D0082EFA98EC4E6C89',
+    '4A298DACAE57395A15D0795DDBFD1DCB564DA82B0F269BC70A74F8220429BA1D1E51A22CCEC35599B8F266912281F8365FFC2D035A230434A1A64DC59F7013FD',
+    'sig[0:32] is not an X coordinate on the curve'),
+
+    TCryptoLibStringArray.Create('Test vector 12',
+    '02DFF1D77F2A671C5F36183726DB2341BE58FEAE1DA2DECED843240F7B502BA659',
+    '243F6A8885A308D313198A2E03707344A4093822299F31D0082EFA98EC4E6C89',
+    'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2F1E51A22CCEC35599B8F266912281F8365FFC2D035A230434A1A64DC59F7013FD',
+    'sig[0:32] is equal to field size'),
+
+    TCryptoLibStringArray.Create('Test vector 13',
+    '02DFF1D77F2A671C5F36183726DB2341BE58FEAE1DA2DECED843240F7B502BA659',
+    '243F6A8885A308D313198A2E03707344A4093822299F31D0082EFA98EC4E6C89',
+    '2A298DACAE57395A15D0795DDBFD1DCB564DA82B0F269BC70A74F8220429BA1DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141',
+    'sig[32:64] is equal to curve order')
+
+    );
 end;
 end;
 
 
 procedure TTestECSchnorr.TearDown;
 procedure TTestECSchnorr.TearDown;
@@ -103,7 +197,7 @@ begin
 
 
 end;
 end;
 
 
-procedure TTestECSchnorr.TestECSchnorrBSI;
+procedure TTestECSchnorr.TestECSchnorrSIPASigningandVerifyingSecp521R1;
 var
 var
   LCurve: IX9ECParameters;
   LCurve: IX9ECParameters;
   domain: IECDomainParameters;
   domain: IECDomainParameters;
@@ -117,7 +211,7 @@ var
 
 
 begin
 begin
 
 
-  LCurve := TSecNamedCurves.GetByName('secp256k1');
+  LCurve := TSecNamedCurves.GetByName('secp521r1');
 
 
   domain := TECDomainParameters.Create(LCurve.Curve, LCurve.G, LCurve.N,
   domain := TECDomainParameters.Create(LCurve.Curve, LCurve.G, LCurve.N,
     LCurve.H, LCurve.GetSeed);
     LCurve.H, LCurve.GetSeed);
@@ -129,7 +223,7 @@ begin
   privParams := keypair.Private as IECPrivateKeyParameters; // for signing
   privParams := keypair.Private as IECPrivateKeyParameters; // for signing
   pubParams := keypair.Public as IECPublicKeyParameters; // for verifying
   pubParams := keypair.Public as IECPublicKeyParameters; // for verifying
 
 
-  signer := TSignerUtilities.GetSigner('SHA-256withECSCHNORRBSI');
+  signer := TSignerUtilities.GetSigner('SHA-256withECSCHNORRSIPA');
 
 
   // sign
   // sign
 
 
@@ -152,165 +246,141 @@ begin
 
 
 end;
 end;
 
 
-procedure TTestECSchnorr.TestECSchnorrISO;
+procedure TTestECSchnorr.TestECSchnorrSIPASigningShouldPass;
 var
 var
-  LCurve: IX9ECParameters;
   domain: IECDomainParameters;
   domain: IECDomainParameters;
-  generator: IECKeyPairGenerator;
-  keygenParams: IECKeyGenerationParameters;
-  keypair: IAsymmetricCipherKeyPair;
-  privParams: IECPrivateKeyParameters;
-  pubParams: IECPublicKeyParameters;
+  RegeneratedPrivateKey: IECPrivateKeyParameters;
+  RegeneratedPublicKey: IECPublicKeyParameters;
+  PrivateKeyByteArray, PublicKeyByteArray, &message, sigBytes,
+    expectedSignature: TBytes;
+  point: IECPoint;
+  LCurve: IX9ECParameters;
   signer: ISigner;
   signer: ISigner;
-  &message, sigBytes: TBytes;
-
+  param: IParametersWithRandom;
+  vector: TCryptoLibStringArray;
 begin
 begin
 
 
   LCurve := TSecNamedCurves.GetByName('secp256k1');
   LCurve := TSecNamedCurves.GetByName('secp256k1');
 
 
   domain := TECDomainParameters.Create(LCurve.Curve, LCurve.G, LCurve.N,
   domain := TECDomainParameters.Create(LCurve.Curve, LCurve.G, LCurve.N,
     LCurve.H, LCurve.GetSeed);
     LCurve.H, LCurve.GetSeed);
-  generator := TECKeyPairGenerator.Create('ECSCHNORR');
-  keygenParams := TECKeyGenerationParameters.Create(domain, FRandom);
-  generator.Init(keygenParams);
 
 
-  keypair := generator.GenerateKeyPair();
-  privParams := keypair.Private as IECPrivateKeyParameters; // for signing
-  pubParams := keypair.Public as IECPublicKeyParameters; // for verifying
+  for vector in FECSchnorrSipaSigningPassTestVector do
+  begin
 
 
-  signer := TSignerUtilities.GetSigner('SHA-256withECSCHNORRISO');
+    PrivateKeyByteArray := TBigInteger.Create(vector[1], 16).ToByteArray;
+    PublicKeyByteArray := TBigInteger.Create(vector[2], 16).ToByteArray;
+    &message := THex.Decode(vector[3]);
+    expectedSignature := THex.Decode(vector[4]);
 
 
-  // sign
+    point := LCurve.Curve.DecodePoint(PublicKeyByteArray);
 
 
-  signer.Init(true, privParams);
+    RegeneratedPrivateKey := TECPrivateKeyParameters.Create('ECSCHNORR',
+      TBigInteger.Create(PrivateKeyByteArray), domain);
 
 
-  &message := TConverters.ConvertStringToBytes('PascalECSCHNORR',
-    TEncoding.UTF8);
+    RegeneratedPublicKey := TECPublicKeyParameters.Create('ECSCHNORR',
+      point, domain);
 
 
-  signer.BlockUpdate(&message, 0, System.Length(&message));
+    param := TParametersWithRandom.Create(RegeneratedPrivateKey, FRandom);
 
 
-  sigBytes := signer.GenerateSignature();
+    signer := TSignerUtilities.GetSigner('SHA-256withECSCHNORRSIPA');
 
 
-  // verify
+    // sign
 
 
-  signer.Init(false, pubParams);
+    signer.Init(true, param);
 
 
-  signer.BlockUpdate(&message, 0, System.Length(&message));
+    signer.BlockUpdate(&message, 0, System.Length(&message));
 
 
-  CheckTrue(signer.VerifySignature(sigBytes));
+    sigBytes := signer.GenerateSignature();
 
 
-end;
+    CheckTrue(TArrayUtils.AreEqual(expectedSignature, sigBytes),
+      vector[0] + ' Signature did not match Output');
 
 
-procedure TTestECSchnorr.TestECSchnorrISOX;
-var
-  LCurve: IX9ECParameters;
-  domain: IECDomainParameters;
-  generator: IECKeyPairGenerator;
-  keygenParams: IECKeyGenerationParameters;
-  keypair: IAsymmetricCipherKeyPair;
-  privParams: IECPrivateKeyParameters;
-  pubParams: IECPublicKeyParameters;
-  signer: ISigner;
-  &message, sigBytes: TBytes;
-
-begin
-
-  LCurve := TSecNamedCurves.GetByName('secp256k1');
-
-  domain := TECDomainParameters.Create(LCurve.Curve, LCurve.G, LCurve.N,
-    LCurve.H, LCurve.GetSeed);
-  generator := TECKeyPairGenerator.Create('ECSCHNORR');
-  keygenParams := TECKeyGenerationParameters.Create(domain, FRandom);
-  generator.Init(keygenParams);
+    // verify
 
 
-  keypair := generator.GenerateKeyPair();
-  privParams := keypair.Private as IECPrivateKeyParameters; // for signing
-  pubParams := keypair.Public as IECPublicKeyParameters; // for verifying
+    signer.Init(false, RegeneratedPublicKey);
 
 
-  signer := TSignerUtilities.GetSigner('SHA-256withECSCHNORRISOX');
-
-  // sign
-
-  signer.Init(true, privParams);
-
-  &message := TConverters.ConvertStringToBytes('PascalECSCHNORR',
-    TEncoding.UTF8);
+    signer.BlockUpdate(&message, 0, System.Length(&message));
 
 
-  signer.BlockUpdate(&message, 0, System.Length(&message));
-
-  sigBytes := signer.GenerateSignature();
-
-  // verify
-
-  signer.Init(false, pubParams);
-
-  signer.BlockUpdate(&message, 0, System.Length(&message));
-
-  CheckTrue(signer.VerifySignature(sigBytes));
+    CheckTrue(signer.VerifySignature(sigBytes),
+      vector[0] + ' Signature verification Failed');
+  end;
 
 
 end;
 end;
 
 
-procedure TTestECSchnorr.TestECSchnorrLIBSECP;
+procedure TTestECSchnorr.TestECSchnorrSIPAVerificationShouldFail;
 var
 var
-  LCurve: IX9ECParameters;
   domain: IECDomainParameters;
   domain: IECDomainParameters;
-  generator: IECKeyPairGenerator;
-  keygenParams: IECKeyGenerationParameters;
-  keypair: IAsymmetricCipherKeyPair;
-  privParams: IECPrivateKeyParameters;
-  pubParams: IECPublicKeyParameters;
+  RegeneratedPublicKey: IECPublicKeyParameters;
+  PublicKeyByteArray, &message, expectedSignature: TBytes;
+  point: IECPoint;
+  LCurve: IX9ECParameters;
   signer: ISigner;
   signer: ISigner;
-  &message, sigBytes: TBytes;
-
+  vector: TCryptoLibStringArray;
 begin
 begin
 
 
   LCurve := TSecNamedCurves.GetByName('secp256k1');
   LCurve := TSecNamedCurves.GetByName('secp256k1');
 
 
   domain := TECDomainParameters.Create(LCurve.Curve, LCurve.G, LCurve.N,
   domain := TECDomainParameters.Create(LCurve.Curve, LCurve.G, LCurve.N,
     LCurve.H, LCurve.GetSeed);
     LCurve.H, LCurve.GetSeed);
-  generator := TECKeyPairGenerator.Create('ECSCHNORR');
-  keygenParams := TECKeyGenerationParameters.Create(domain, FRandom);
-  generator.Init(keygenParams);
 
 
-  keypair := generator.GenerateKeyPair();
-  privParams := keypair.Private as IECPrivateKeyParameters; // for signing
-  pubParams := keypair.Public as IECPublicKeyParameters; // for verifying
+  for vector in FECSchnorrSipaVerificationFailTestVector do
+  begin
 
 
-  signer := TSignerUtilities.GetSigner('SHA-256withECSCHNORRLIBSECP');
+    PublicKeyByteArray := TBigInteger.Create(vector[1], 16).ToByteArray;
+    &message := THex.Decode(vector[2]);
+    expectedSignature := THex.Decode(vector[3]);
 
 
-  // sign
+    if vector[0] = 'Test vector 5' then
+    begin
 
 
-  signer.Init(true, privParams);
+      try
+        point := LCurve.Curve.DecodePoint(PublicKeyByteArray);
+        Fail(vector[4]);
+      except
+        on E: EArgumentCryptoLibException do
+        begin
 
 
-  &message := TConverters.ConvertStringToBytes('PascalECSCHNORR',
-    TEncoding.UTF8);
+          if E.Message <> 'Invalid Point Compression' then
+          begin
+            Fail('Invalid Exception Thrown');
+          end;
+          Continue;
+        end;
 
 
-  signer.BlockUpdate(&message, 0, System.Length(&message));
+      end;
 
 
-  sigBytes := signer.GenerateSignature();
+    end
+    else
+    begin
+      point := LCurve.Curve.DecodePoint(PublicKeyByteArray);
+    end;
 
 
-  // verify
+    RegeneratedPublicKey := TECPublicKeyParameters.Create('ECSCHNORR',
+      point, domain);
 
 
-  signer.Init(false, pubParams);
+    signer := TSignerUtilities.GetSigner('SHA-256withECSCHNORRSIPA');
 
 
-  signer.BlockUpdate(&message, 0, System.Length(&message));
+    // verify
 
 
-  CheckTrue(signer.VerifySignature(sigBytes));
+    signer.Init(false, RegeneratedPublicKey);
+
+    signer.BlockUpdate(&message, 0, System.Length(&message));
+
+    CheckFalse(signer.VerifySignature(expectedSignature), vector[4]);
+  end;
 
 
 end;
 end;
 
 
-procedure TTestECSchnorr.TestECSchnorrWithCustomK;
+procedure TTestECSchnorr.TestECSchnorrSIPAVerificationShouldPass;
 var
 var
   domain: IECDomainParameters;
   domain: IECDomainParameters;
-  RegeneratedPrivateKey: IECPrivateKeyParameters;
   RegeneratedPublicKey: IECPublicKeyParameters;
   RegeneratedPublicKey: IECPublicKeyParameters;
-  BigXCoordByteArray, BigYCoordByteArray, PrivateKeyByteArray, &message,
-    sigBytes: TBytes;
+  PublicKeyByteArray, &message, expectedSignature: TBytes;
   point: IECPoint;
   point: IECPoint;
   LCurve: IX9ECParameters;
   LCurve: IX9ECParameters;
   signer: ISigner;
   signer: ISigner;
-  k: ISecureRandom;
-  param: IParametersWithRandom;
+  vector: TCryptoLibStringArray;
 begin
 begin
 
 
   LCurve := TSecNamedCurves.GetByName('secp256k1');
   LCurve := TSecNamedCurves.GetByName('secp256k1');
@@ -318,55 +388,29 @@ begin
   domain := TECDomainParameters.Create(LCurve.Curve, LCurve.G, LCurve.N,
   domain := TECDomainParameters.Create(LCurve.Curve, LCurve.G, LCurve.N,
     LCurve.H, LCurve.GetSeed);
     LCurve.H, LCurve.GetSeed);
 
 
-  BigXCoordByteArray := TBigInteger.Create
-    ('65d5b8bf9ab1801c9f168d4815994ad35f1dcb6ae6c7a1a303966b677b813b00', 16)
-    .ToByteArray;
-
-  BigYCoordByteArray := TBigInteger.Create
-    ('e6b865e529b8ecbf71cf966e900477d49ced5846d7662dd2dd11ccd55c0aff7f', 16)
-    .ToByteArray;
+  for vector in FECSchnorrSipaVerificationPassTestVector do
+  begin
 
 
-  PrivateKeyByteArray := TBigInteger.Create
-    ('fb26a4e75eec75544c0f44e937dcf5ee6355c7176600b9688c667e5c283b43c5', 16)
-    .ToByteArray;
+    PublicKeyByteArray := TBigInteger.Create(vector[1], 16).ToByteArray;
+    &message := THex.Decode(vector[2]);
+    expectedSignature := THex.Decode(vector[3]);
 
 
-  point := LCurve.Curve.CreatePoint(TBigInteger.Create(1, BigXCoordByteArray),
-    TBigInteger.Create(1, BigYCoordByteArray));
+    point := LCurve.Curve.DecodePoint(PublicKeyByteArray);
 
 
-  RegeneratedPublicKey := TECPublicKeyParameters.Create('ECSCHNORR',
-    point, domain);
+    RegeneratedPublicKey := TECPublicKeyParameters.Create('ECSCHNORR',
+      point, domain);
 
 
-  RegeneratedPrivateKey := TECPrivateKeyParameters.Create('ECSCHNORR',
-    TBigInteger.Create(PrivateKeyByteArray), domain);
+    signer := TSignerUtilities.GetSigner('SHA-256withECSCHNORRSIPA');
 
 
-  k := TFixedSecureRandom.From(TCryptoLibMatrixByteArray.Create
-    (TBigInteger.Create
-    ('4242424242424242424242424242424242424242424242424242424242424242',
-    16).ToByteArrayUnsigned()));
+    // verify
 
 
-  param := TParametersWithRandom.Create(RegeneratedPrivateKey, k);
+    signer.Init(false, RegeneratedPublicKey);
 
 
-  signer := TSignerUtilities.GetSigner('SHA-256withECSCHNORRLIBSECP');
+    signer.BlockUpdate(&message, 0, System.Length(&message));
 
 
-  // sign
-
-  signer.Init(true, param);
-
-  &message := TBigInteger.Create
-    ('0101010101010101010101010101010101010101010101010101010101010101', 16)
-    .ToByteArray;
-
-  signer.BlockUpdate(&message, 0, System.Length(&message));
-
-  sigBytes := signer.GenerateSignature();
-
-  // verify
-
-  signer.Init(false, RegeneratedPublicKey);
-
-  signer.BlockUpdate(&message, 0, System.Length(&message));
-
-  CheckTrue(signer.VerifySignature(sigBytes));
+    CheckTrue(signer.VerifySignature(expectedSignature),
+      vector[0] + ' Signature verification Failed');
+  end;
 
 
 end;
 end;
 
 

+ 20 - 2
CryptoLib/src/Asn1/ClpDerT61String.pas

@@ -45,12 +45,19 @@ type
   TDerT61String = class(TDerStringBase, IDerT61String)
   TDerT61String = class(TDerStringBase, IDerT61String)
 
 
   strict private
   strict private
+    class var
+
+      FEncoding: TEncoding;
+
   var
   var
     FStr: String;
     FStr: String;
 
 
     function GetStr: String; inline;
     function GetStr: String; inline;
     property Str: String read GetStr;
     property Str: String read GetStr;
 
 
+    class constructor CreateDerT61String();
+    class destructor DestroyDerT61String();
+
   strict protected
   strict protected
     function Asn1Equals(const asn1Object: IAsn1Object): Boolean; override;
     function Asn1Equals(const asn1Object: IAsn1Object): Boolean; override;
   public
   public
@@ -114,7 +121,7 @@ end;
 
 
 function TDerT61String.GetOctets: TCryptoLibByteArray;
 function TDerT61String.GetOctets: TCryptoLibByteArray;
 begin
 begin
-  result := TConverters.ConvertStringToBytes(Str, TEncoding.ANSI);
+  result := TConverters.ConvertStringToBytes(Str, FEncoding);
 end;
 end;
 
 
 function TDerT61String.Asn1Equals(const asn1Object: IAsn1Object): Boolean;
 function TDerT61String.Asn1Equals(const asn1Object: IAsn1Object): Boolean;
@@ -133,7 +140,8 @@ end;
 
 
 constructor TDerT61String.Create(const Str: TCryptoLibByteArray);
 constructor TDerT61String.Create(const Str: TCryptoLibByteArray);
 begin
 begin
-  Create(TConverters.ConvertBytesToString(Str, TEncoding.ANSI));
+  Inherited Create();
+  Create(TConverters.ConvertBytesToString(Str, FEncoding));
 end;
 end;
 
 
 constructor TDerT61String.Create(const Str: String);
 constructor TDerT61String.Create(const Str: String);
@@ -147,6 +155,16 @@ begin
   FStr := Str;
   FStr := Str;
 end;
 end;
 
 
+class constructor TDerT61String.CreateDerT61String;
+begin
+  FEncoding := TEncoding.GetEncoding('iso-8859-1');
+end;
+
+class destructor TDerT61String.DestroyDerT61String;
+begin
+  FEncoding.Free;
+end;
+
 procedure TDerT61String.Encode(const derOut: IDerOutputStream);
 procedure TDerT61String.Encode(const derOut: IDerOutputStream);
 begin
 begin
   derOut.WriteEncoded(TAsn1Tags.T61String, GetOctets());
   derOut.WriteEncoded(TAsn1Tags.T61String, GetOctets());

+ 4 - 5
CryptoLib/src/Crypto/Signers/ClpDsaDigestSigner.pas

@@ -40,9 +40,9 @@ uses
 resourcestring
 resourcestring
   SPrivateKey = 'Signing Requires Private Key.';
   SPrivateKey = 'Signing Requires Private Key.';
   SPublicKey = 'Verification Requires Public Key.';
   SPublicKey = 'Verification Requires Public Key.';
-  SDSaDigestSignerNotInitializedForSignatureGeneration =
+  SDsaDigestSignerNotInitializedForSignatureGeneration =
     'DSADigestSigner not Initialized for Signature Generation.';
     'DSADigestSigner not Initialized for Signature Generation.';
-  SDSaDigestSignerNotInitializedForVerification =
+  SDsaDigestSignerNotInitializedForVerification =
     'DSADigestSigner not Initialized for Verification';
     'DSADigestSigner not Initialized for Verification';
   SEncodingError = 'Unable to Encode Signature';
   SEncodingError = 'Unable to Encode Signature';
 
 
@@ -137,7 +137,7 @@ begin
   if ((not FforSigning)) then
   if ((not FforSigning)) then
   begin
   begin
     raise EInvalidOperationCryptoLibException.CreateRes
     raise EInvalidOperationCryptoLibException.CreateRes
-      (@SDSaDigestSignerNotInitializedForSignatureGeneration);
+      (@SDsaDigestSignerNotInitializedForSignatureGeneration);
   end;
   end;
 
 
   System.SetLength(hash, Fdigest.GetDigestSize);
   System.SetLength(hash, Fdigest.GetDigestSize);
@@ -168,7 +168,6 @@ begin
   begin
   begin
     Result := Default (TBigInteger);
     Result := Default (TBigInteger);
   end;
   end;
-
 end;
 end;
 
 
 procedure TDsaDigestSigner.Init(forSigning: Boolean;
 procedure TDsaDigestSigner.Init(forSigning: Boolean;
@@ -222,7 +221,7 @@ begin
   if (FforSigning) then
   if (FforSigning) then
   begin
   begin
     raise EInvalidOperationCryptoLibException.CreateRes
     raise EInvalidOperationCryptoLibException.CreateRes
-      (@SDSaDigestSignerNotInitializedForVerification);
+      (@SDsaDigestSignerNotInitializedForVerification);
   end;
   end;
 
 
   System.SetLength(hash, Fdigest.GetDigestSize);
   System.SetLength(hash, Fdigest.GetDigestSize);

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

@@ -1,151 +0,0 @@
-{ *********************************************************************************** }
-{ *                              CryptoLib Library                                  * }
-{ *                Copyright (c) 2018 - 20XX Ugochukwu Mmaduekwe                    * }
-{ *                 Github Repository <https://github.com/Xor-el>                   * }
-
-{ *  Distributed under the MIT software license, see the accompanying file LICENSE  * }
-{ *          or visit http://www.opensource.org/licenses/mit-license.php.           * }
-
-{ *                              Acknowledgements:                                  * }
-{ *                                                                                 * }
-{ *      Thanks to Sphere 10 Software (http://www.sphere10.com/) for sponsoring     * }
-{ *                           development of this library                           * }
-
-{ * ******************************************************************************* * }
-
-(* &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& *)
-
-unit 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;
-
-  System.SetLength(tempR, digest.GetDigestSize);
-  digest.BlockUpdate(&message, 0, System.Length(&message));
-  digest.BlockUpdate(xQ, 0, System.Length(xQ));
-  digest.DoFinal(tempR, 0);
-
-  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;
-
-  System.SetLength(tempV, digest.GetDigestSize);
-  digest.BlockUpdate(&message, 0, System.Length(&message));
-  digest.BlockUpdate(xQ, 0, System.Length(xQ));
-  digest.DoFinal(tempV, 0);
-
-  v := TBigInteger.Create(1, tempV);
-  Result := v.Equals(r);
-  Exit;
-
-end;
-
-function TECSchnorrBSISigner.GetAlgorithmName: String;
-begin
-  Result := 'BSI';
-end;
-
-end.

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

@@ -1,155 +0,0 @@
-{ *********************************************************************************** }
-{ *                              CryptoLib Library                                  * }
-{ *                Copyright (c) 2018 - 20XX Ugochukwu Mmaduekwe                    * }
-{ *                 Github Repository <https://github.com/Xor-el>                   * }
-
-{ *  Distributed under the MIT software license, see the accompanying file LICENSE  * }
-{ *          or visit http://www.opensource.org/licenses/mit-license.php.           * }
-
-{ *                              Acknowledgements:                                  * }
-{ *                                                                                 * }
-{ *      Thanks to Sphere 10 Software (http://www.sphere10.com/) for sponsoring     * }
-{ *                           development of this library                           * }
-
-{ * ******************************************************************************* * }
-
-(* &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& *)
-
-unit 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;
-
-  System.SetLength(tempR, digest.GetDigestSize);
-  digest.BlockUpdate(xQ, 0, System.Length(xQ));
-  digest.BlockUpdate(yQ, 0, System.Length(yQ));
-  digest.BlockUpdate(&message, 0, System.Length(&message));
-  digest.DoFinal(tempR, 0);
-
-  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;
-
-  System.SetLength(tempV, digest.GetDigestSize);
-  digest.BlockUpdate(xQ, 0, System.Length(xQ));
-  digest.BlockUpdate(yQ, 0, System.Length(yQ));
-  digest.BlockUpdate(&message, 0, System.Length(&message));
-  digest.DoFinal(tempV, 0);
-
-  v := TBigInteger.Create(1, tempV);
-  Result := v.Equals(r);
-  Exit;
-
-end;
-
-function TECSchnorrISOSigner.GetAlgorithmName: String;
-begin
-  Result := 'ISO';
-end;
-
-end.

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

@@ -1,151 +0,0 @@
-{ *********************************************************************************** }
-{ *                              CryptoLib Library                                  * }
-{ *                Copyright (c) 2018 - 20XX Ugochukwu Mmaduekwe                    * }
-{ *                 Github Repository <https://github.com/Xor-el>                   * }
-
-{ *  Distributed under the MIT software license, see the accompanying file LICENSE  * }
-{ *          or visit http://www.opensource.org/licenses/mit-license.php.           * }
-
-{ *                              Acknowledgements:                                  * }
-{ *                                                                                 * }
-{ *      Thanks to Sphere 10 Software (http://www.sphere10.com/) for sponsoring     * }
-{ *                           development of this library                           * }
-
-{ * ******************************************************************************* * }
-
-(* &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& *)
-
-unit 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;
-
-  System.SetLength(tempR, digest.GetDigestSize);
-  digest.BlockUpdate(xQ, 0, System.Length(xQ));
-  digest.BlockUpdate(&message, 0, System.Length(&message));
-  digest.DoFinal(tempR, 0);
-
-  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;
-
-  System.SetLength(tempV, digest.GetDigestSize);
-  digest.BlockUpdate(xQ, 0, System.Length(xQ));
-  digest.BlockUpdate(&message, 0, System.Length(&message));
-  digest.DoFinal(tempV, 0);
-
-  v := TBigInteger.Create(1, tempV);
-  Result := v.Equals(r);
-  Exit;
-
-end;
-
-function TECSchnorrISOXSigner.GetAlgorithmName: String;
-begin
-  Result := 'ISOX';
-end;
-
-end.

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

@@ -1,161 +0,0 @@
-{ *********************************************************************************** }
-{ *                              CryptoLib Library                                  * }
-{ *                Copyright (c) 2018 - 20XX Ugochukwu Mmaduekwe                    * }
-{ *                 Github Repository <https://github.com/Xor-el>                   * }
-
-{ *  Distributed under the MIT software license, see the accompanying file LICENSE  * }
-{ *          or visit http://www.opensource.org/licenses/mit-license.php.           * }
-
-{ *                              Acknowledgements:                                  * }
-{ *                                                                                 * }
-{ *      Thanks to Sphere 10 Software (http://www.sphere10.com/) for sponsoring     * }
-{ *                           development of this library                           * }
-
-{ * ******************************************************************************* * }
-
-(* &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& *)
-
-unit 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;
-
-  System.SetLength(tempH, digest.GetDigestSize);
-  digest.BlockUpdate(rQ, 0, System.Length(rQ));
-  digest.BlockUpdate(&message, 0, System.Length(&message));
-  digest.DoFinal(tempH, 0);
-
-  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;
-
-  System.SetLength(tempH, digest.GetDigestSize);
-  digest.BlockUpdate(rb, 0, System.Length(rb));
-  digest.BlockUpdate(&message, 0, System.Length(&message));
-  digest.DoFinal(tempH, 0);
-
-  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.

+ 0 - 364
CryptoLib/src/Crypto/Signers/ClpECSchnorrSigner.pas

@@ -1,364 +0,0 @@
-{ *********************************************************************************** }
-{ *                              CryptoLib Library                                  * }
-{ *                Copyright (c) 2018 - 20XX Ugochukwu Mmaduekwe                    * }
-{ *                 Github Repository <https://github.com/Xor-el>                   * }
-
-{ *  Distributed under the MIT software license, see the accompanying file LICENSE  * }
-{ *          or visit http://www.opensource.org/licenses/mit-license.php.           * }
-
-{ *                              Acknowledgements:                                  * }
-{ *                                                                                 * }
-{ *      Thanks to Sphere 10 Software (http://www.sphere10.com/) for sponsoring     * }
-{ *                           development of this library                           * }
-
-{ * ******************************************************************************* * }
-
-(* &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& *)
-
-unit ClpECSchnorrSigner;
-
-{$I ..\..\Include\CryptoLib.inc}
-
-interface
-
-uses
-  SysUtils,
-  Classes,
-  ClpIDigest,
-  ClpISigner,
-  ClpSecureRandom,
-  ClpISecureRandom,
-  ClpICipherParameters,
-  ClpISchnorr,
-  ClpIECSchnorrSigner,
-  ClpIParametersWithRandom,
-  ClpDerSequence,
-  ClpDerInteger,
-  ClpIDerInteger,
-  ClpAsn1Object,
-  ClpIAsn1Sequence,
-  ClpBigInteger,
-  ClpBigIntegers,
-  ClpIECKeyParameters,
-  ClpIECPublicKeyParameters,
-  ClpIECPrivateKeyParameters,
-  ClpCryptoLibTypes;
-
-resourcestring
-  SECPublicKeyNotFound = 'EC Public Key Required for Verification';
-  SECPrivateKeyNotFound = 'EC Private Key Required for Signing';
-  SCurveNil = 'Key has no Curve';
-
-type
-  TECSchnorrSigner = class(TInterfacedObject, ISigner, IECSchnorrSigner)
-
-  strict private
-
-  var
-    FDigest: IDigest;
-    FRandom: ISecureRandom;
-    FSigner: ISchnorr;
-    FforSigning: Boolean;
-    Fkey: IECKeyParameters;
-    FBuffer: TMemoryStream;
-
-    function Aggregate: TCryptoLibByteArray; inline;
-
-  public
-
-    function Do_Sign(const pv_key: IECPrivateKeyParameters;
-      const k: TBigInteger): TCryptoLibByteArray;
-
-    function Do_Verify(const pu_key: IECPublicKeyParameters;
-      const sig: TCryptoLibByteArray): Boolean;
-
-    class function Encode_Sig(const r, s: TBigInteger)
-      : TCryptoLibByteArray; static;
-
-    class function Decode_Sig(const sig: TCryptoLibByteArray)
-      : TCryptoLibGenericArray<TBigInteger>; static;
-
-
-    // ECSchnorr signer implementation according to:
-    //
-    // - `BSI:TR03111 <https://www.bsi.bund.de/SharedDocs/Downloads/EN/BSI/Publications/TechGuidelines/TR03111/BSI-TR-03111_pdf.html>`_
-    // - `ISO/IEC:14888-3 <http://www.iso.org/iso/iso_catalogue/catalogue_ics/catalogue_detail_ics.htm?csnumber=43656>`_
-    // - `bitcoin-core:libsecp256k1 <https://github.com/bitcoin-core/secp256k1/blob/master/src/modules/schnorr/schnorr_impl.h>`_
-    //
-    //
-    //
-    // *Signature*:
-    //
-    // - "BSI": compute r,s according to to BSI :
-    // 1. k = RNG(1:n-1)
-    // 2. Q = [k]G
-    // 3. r = H(M ||Qx)
-    // If r = 0 mod n, goto 1.
-    // 4. s = k - r.d mod n
-    // If s = 0 goto 1.
-    // 5. Output (r, s)
-    // - "ISO": compute r,s according to ISO :
-    // 1. k = RNG(1:n-1)
-    // 2. Q = [k]G
-    // If r = 0 mod n, goto 1.
-    // 3. r = H(Qx||Qy||M).
-    // 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:
-    // 1. k = RNG(1:n-1)
-    // 2. Q = [k]G
-    // If r = 0 mod n, goto 1.
-    // 3. r = H(Qx||Qy||M).
-    // 4. s = (k + r.d) mod n
-    // If s = 0 goto 1.
-    // 5. Output (r, s)
-    // - "LIBSECP": compute r,s according to bitcoin lib:
-    // 1. k = RNG(1:n-1)
-    // 2. Q = [k]G
-    // if Qy is odd, negate k and goto 2
-    // 3. r = Qx % n
-    // 4. h = H(r || m).
-    // if h == 0 or h >= order goto 1
-    // 5. s = k - h.d.
-    // 6. Output (r, s)
-    //
-    // *Verification*
-    //
-    // - "BSI": verify r,s according to to BSI :
-    // 1. Verify that r in {0, . . . , 2**t - 1} and s in {1, 2, . . . , n - 1}.
-    // If the check fails, output False and terminate.
-    // 2. Q = [s]G + [r]W
-    // If Q = 0, output Error and terminate.
-    // 3. v = H(M||Qx)
-    // 4. Output True if v = r, and False otherwise.
-    // - "ISO": verify r,s according to ISO :
-    // 1. check...
-    // 2. Q = [s]G - [r]W
-    // 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:
-    // 1. check...
-    // 2. Q = [s]G - [r]W
-    // If Q = 0, output Error and terminate.
-    // 3. v = H(Qx||M).
-    // 4. Output True if v = r, and False otherwise.
-    // - "LIBSECP":
-    // 1. Signature is invalid if s >= order.
-    // Signature is invalid if r >= p.
-    // 2. h = H(r || m).
-    // Signature is invalid if h == 0 or h >= order.
-    // 3. R = [h]Q + [s]G.
-    // 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>
-    constructor Create(const signer: ISchnorr; const digest: IDigest);
-    destructor Destroy(); override;
-
-    function GetAlgorithmName: String;
-    property AlgorithmName: String read GetAlgorithmName;
-
-    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(const 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(const signature: TCryptoLibByteArray): Boolean;
-
-    /// <summary>
-    /// Reset the internal state
-    /// </summary>
-    procedure Reset();
-  end;
-
-implementation
-
-{ TECSchnorrSigner }
-
-class function TECSchnorrSigner.Encode_Sig(const r, s: TBigInteger)
-  : TCryptoLibByteArray;
-begin
-  Result := TDerSequence.Create([TDerInteger.Create(r) as IDerInteger,
-    TDerInteger.Create(s) as IDerInteger]).GetDerEncoded();
-end;
-
-class function TECSchnorrSigner.Decode_Sig(const sig: TCryptoLibByteArray)
-  : TCryptoLibGenericArray<TBigInteger>;
-var
-  s: IAsn1Sequence;
-begin
-  s := TAsn1Object.FromByteArray(sig) as IAsn1Sequence;
-  Result := TCryptoLibGenericArray<TBigInteger>.Create
-    ((s[0] as IDerInteger).value, (s[1] as IDerInteger).value);
-end;
-
-function TECSchnorrSigner.Aggregate: TCryptoLibByteArray;
-begin
-  FBuffer.Position := 0;
-  System.SetLength(Result, FBuffer.Size);
-  FBuffer.Read(Result[0], FBuffer.Size);
-end;
-
-procedure TECSchnorrSigner.BlockUpdate(const input: TCryptoLibByteArray;
-  inOff, length: Int32);
-begin
-  FBuffer.Write(input[inOff], length);
-end;
-
-constructor TECSchnorrSigner.Create(const signer: ISchnorr;
-  const digest: IDigest);
-begin
-  inherited Create();
-  FDigest := digest;
-  FSigner := signer;
-  FBuffer := TMemoryStream.Create();
-end;
-
-destructor TECSchnorrSigner.Destroy;
-begin
-  FBuffer.Free;
-  inherited Destroy;
-end;
-
-function TECSchnorrSigner.Do_Sign(const pv_key: IECPrivateKeyParameters;
-  const k: TBigInteger): TCryptoLibByteArray;
-begin
-
-  if (pv_key.parameters.curve = Nil) then
-  begin
-    raise EArgumentNilCryptoLibException.CreateRes(@SCurveNil)
-  end;
-
-  Result := FSigner.Do_Sign(Aggregate(), FDigest, pv_key, k);
-end;
-
-function TECSchnorrSigner.Do_Verify(const pu_key: IECPublicKeyParameters;
-  const sig: TCryptoLibByteArray): Boolean;
-begin
-
-  if (pu_key.parameters.curve = Nil) then
-  begin
-    raise EArgumentNilCryptoLibException.CreateRes(@SCurveNil)
-  end;
-
-  Result := FSigner.Do_Verify(Aggregate(), FDigest, pu_key, sig);
-end;
-
-function TECSchnorrSigner.GenerateSignature: TCryptoLibByteArray;
-var
-  order, k, orderMinusOne: TBigInteger;
-  pv_key_params: IECPrivateKeyParameters;
-begin
-
-  pv_key_params := Fkey as IECPrivateKeyParameters;
-  order := pv_key_params.parameters.curve.order;
-  orderMinusOne := order.Subtract(TBigInteger.One);
-
-  repeat
-    // k := [1, q - 1]
-    k := TBigIntegers.CreateRandomInRange(TBigInteger.One,
-      orderMinusOne, FRandom);
-
-    Result := Do_Sign(pv_key_params, k);
-  until (Result <> Nil);
-
-end;
-
-function TECSchnorrSigner.GetAlgorithmName: String;
-begin
-  Result := FDigest.AlgorithmName + 'with' + 'ECSCHNORR' +
-    FSigner.AlgorithmName;
-end;
-
-procedure TECSchnorrSigner.Init(forSigning: Boolean;
-  const parameters: ICipherParameters);
-var
-  rParam: IParametersWithRandom;
-  Lparameters: ICipherParameters;
-begin
-
-  FforSigning := forSigning;
-  Lparameters := parameters;
-
-  if (forSigning) then
-  begin
-
-    if (Supports(Lparameters, IParametersWithRandom, rParam)) then
-    begin
-      FRandom := rParam.Random;
-      Lparameters := rParam.parameters;
-    end
-    else
-    begin
-      FRandom := TSecureRandom.Create();
-    end;
-
-    if (not(Supports(Lparameters, IECPrivateKeyParameters))) then
-    begin
-      raise EInvalidKeyCryptoLibException.CreateRes(@SECPrivateKeyNotFound);
-    end;
-
-    Fkey := Lparameters as IECPrivateKeyParameters;
-  end
-  else
-  begin
-    if (not(Supports(Lparameters, IECPublicKeyParameters))) then
-    begin
-      raise EInvalidKeyCryptoLibException.CreateRes(@SECPublicKeyNotFound);
-    end;
-
-    Fkey := Lparameters as IECPublicKeyParameters;
-  end;
-  Reset();
-end;
-
-procedure TECSchnorrSigner.Reset;
-begin
-  FDigest.Reset;
-  FBuffer.Clear;
-  FBuffer.SetSize(0);
-end;
-
-procedure TECSchnorrSigner.Update(input: Byte);
-begin
-  FBuffer.Write(TCryptoLibByteArray.Create(input)[0], 1);
-end;
-
-function TECSchnorrSigner.VerifySignature(const signature
-  : TCryptoLibByteArray): Boolean;
-var
-  pu_key_params: IECPublicKeyParameters;
-begin
-
-  pu_key_params := Fkey as IECPublicKeyParameters;
-
-  Result := Do_Verify(pu_key_params, signature);
-
-end;
-
-end.

+ 292 - 0
CryptoLib/src/Crypto/Signers/ClpECSchnorrSipaSigner.pas

@@ -0,0 +1,292 @@
+{ *********************************************************************************** }
+{ *                              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 ClpECSchnorrSipaSigner;
+
+{$I ..\..\Include\CryptoLib.inc}
+
+interface
+
+uses
+  SysUtils,
+  ClpIDigest,
+  ClpISchnorrExt,
+  ClpIECInterface,
+  ClpIECSchnorrSipaSigner,
+  ClpBigInteger,
+  ClpBigIntegers,
+  ClpISecureRandom,
+  ClpIECKeyParameters,
+  ClpIParametersWithRandom,
+  ClpICipherParameters,
+  ClpIECPrivateKeyParameters,
+  ClpIECPublicKeyParameters,
+  ClpSecureRandom,
+  ClpECAlgorithms,
+  ClpDigestUtilities,
+  ClpArrayUtils,
+  ClpCryptoLibTypes;
+
+resourcestring
+  SECPublicKeyNotFound = 'EC Public Key Required for Verification';
+  SECPrivateKeyNotFound = 'EC Private Key Required for Signing';
+  SNotInitializedForSigning = 'Not Initialised For Signing';
+  SNotInitializedForVerifying = 'Not Initialised For Verifying';
+  SSignatureGenerationError = 'An Error Occurred During Signature Generation';
+  SOnlyFPCurvesAllowed =
+    'Only FP (Prime Field) Curves are Allowed for This Schnorr Implementation';
+
+type
+
+  /// <summary>
+  /// <para>
+  /// Schnorr Signature as described in <see href="https://github.com/sipa/bips/blob/bip-schnorr/bip-schnorr.mediawiki">
+  /// bip-schnorr</see>
+  /// </para>
+  /// <para>
+  /// This <c>Schnorr</c> implementation only allows <c>FP(Prime Field)</c>
+  /// Curves.
+  /// </para>
+  /// </summary>
+  TECSchnorrSipaSigner = class sealed(TInterfacedObject, ISchnorrExt,
+    IECSchnorrSipaSigner)
+
+  strict private
+  var
+    FForSigning: Boolean;
+    FKey: IECKeyParameters;
+    FRandom: ISecureRandom;
+    FDigest: IDigest;
+
+    function GetAlgorithmName: String; virtual;
+    function GetOrder: TBigInteger; virtual;
+
+    function GetPP: TBigInteger; inline;
+    function GetG: IECPoint; inline;
+    function GetCurve: IECCurve; inline;
+
+    property PP: TBigInteger read GetPP;
+    property G: IECPoint read GetG;
+    property Curve: IECCurve read GetCurve;
+
+    class procedure ValidateAllowedCurves(const ACurve: IECCurve);
+      static; inline;
+
+    procedure Reset();
+
+  public
+
+    property Order: TBigInteger read GetOrder;
+    property AlgorithmName: String read GetAlgorithmName;
+
+    procedure Init(forSigning: Boolean; const parameters: ICipherParameters;
+      const digest: IDigest); virtual;
+
+    function GenerateSignature(const &message: TCryptoLibByteArray)
+      : TCryptoLibGenericArray<TBigInteger>; virtual;
+
+    function VerifySignature(const &message: TCryptoLibByteArray;
+      const RSig, SSig: TBigInteger): Boolean; virtual;
+
+  end;
+
+implementation
+
+{ TECSchnorrSipaSigner }
+
+function TECSchnorrSipaSigner.GenerateSignature(const &message
+  : TCryptoLibByteArray): TCryptoLibGenericArray<TBigInteger>;
+var
+  N, k, s, Xr, Yr, e, PrivateKey: TBigInteger;
+  input, keyPrefixedM: TCryptoLibByteArray;
+  P, r: IECPoint;
+  numBytes: Int32;
+begin
+  if (not FForSigning) then
+  begin
+    // not properly initialized... deal with it
+    raise EInvalidOperationCryptoLibException.CreateRes
+      (@SNotInitializedForSigning);
+  end;
+
+  N := Order;
+  numBytes := TBigIntegers.GetUnsignedByteLength(N);
+
+  PrivateKey := (FKey as IECPrivateKeyParameters).D;
+
+  input := TArrayUtils.Concatenate(TBigIntegers.BigIntegerToBytes(PrivateKey,
+    numBytes), &message);
+
+  k := TBigInteger.Create(1, TDigestUtilities.DoFinal(FDigest, input)).&Mod(N);
+
+  if k.CompareTo(TBigInteger.Zero) = 0 then
+  begin
+    raise EInvalidOperationCryptoLibException.CreateRes
+      (@SSignatureGenerationError);
+  end;
+
+  r := G.Multiply(k).Normalize();
+  Xr := r.XCoord.ToBigInteger();
+  Yr := r.YCoord.ToBigInteger();
+  if (TBigInteger.Jacobi(Yr, PP) <> 1) then
+  begin
+    k := N.Subtract(k);
+  end;
+
+  P := G.Multiply(PrivateKey);
+  keyPrefixedM := TArrayUtils.Concatenate(TBigIntegers.BigIntegerToBytes(Xr,
+    numBytes), TCryptoLibMatrixByteArray.Create(P.GetEncoded(true), &message));
+
+  e := TBigInteger.Create(1, TDigestUtilities.DoFinal(FDigest,
+    keyPrefixedM)).&Mod(N);
+
+  s := k.Add(e.Multiply(PrivateKey)).&Mod(N);
+
+  result := TCryptoLibGenericArray<TBigInteger>.Create(Xr, s);
+end;
+
+function TECSchnorrSipaSigner.GetAlgorithmName: String;
+begin
+  result := 'ECSCHNORRSIPA';
+end;
+
+function TECSchnorrSipaSigner.GetCurve: IECCurve;
+begin
+  result := FKey.parameters.Curve;
+end;
+
+function TECSchnorrSipaSigner.GetG: IECPoint;
+begin
+  result := FKey.parameters.G;
+end;
+
+function TECSchnorrSipaSigner.GetOrder: TBigInteger;
+begin
+  result := FKey.parameters.N;
+end;
+
+function TECSchnorrSipaSigner.GetPP: TBigInteger;
+begin
+  result := Curve.Field.Characteristic;
+end;
+
+class procedure TECSchnorrSipaSigner.ValidateAllowedCurves
+  (const ACurve: IECCurve);
+begin
+  if (not(TECAlgorithms.IsFpCurve(ACurve))) then
+  begin
+    raise EArgumentCryptoLibException.CreateRes(@SOnlyFPCurvesAllowed);
+  end;
+end;
+
+procedure TECSchnorrSipaSigner.Init(forSigning: Boolean;
+  const parameters: ICipherParameters; const digest: IDigest);
+var
+  rParam: IParametersWithRandom;
+  Lparameters: ICipherParameters;
+begin
+  FForSigning := forSigning;
+  FDigest := digest;
+  Lparameters := parameters;
+
+  if (forSigning) then
+  begin
+
+    if (Supports(Lparameters, IParametersWithRandom, rParam)) then
+    begin
+      FRandom := rParam.random;
+      Lparameters := rParam.parameters;
+    end
+    else
+    begin
+      FRandom := TSecureRandom.Create();
+    end;
+
+    if (not(Supports(Lparameters, IECPrivateKeyParameters))) then
+    begin
+      raise EInvalidKeyCryptoLibException.CreateRes(@SECPrivateKeyNotFound);
+    end;
+
+    FKey := Lparameters as IECPrivateKeyParameters;
+  end
+  else
+  begin
+    if (not(Supports(Lparameters, IECPublicKeyParameters))) then
+    begin
+      raise EInvalidKeyCryptoLibException.CreateRes(@SECPublicKeyNotFound);
+    end;
+
+    FKey := Lparameters as IECPublicKeyParameters;
+  end;
+
+  ValidateAllowedCurves(Curve);
+  Reset();
+end;
+
+procedure TECSchnorrSipaSigner.Reset;
+begin
+  FDigest.Reset;
+end;
+
+function TECSchnorrSipaSigner.VerifySignature(const &message
+  : TCryptoLibByteArray; const RSig, SSig: TBigInteger): Boolean;
+var
+  N, e: TBigInteger;
+  PublicKeyBytes, input: TCryptoLibByteArray;
+  PublicKey: IECPublicKeyParameters;
+  P, Q, r: IECPoint;
+  numBytes: Int32;
+begin
+  if (FForSigning) then
+  begin
+    // not properly initialized... deal with it
+    raise EInvalidOperationCryptoLibException.CreateRes
+      (@SNotInitializedForVerifying);
+  end;
+
+  N := Order;
+  numBytes := TBigIntegers.GetUnsignedByteLength(N);
+
+  if ((RSig.CompareTo(PP) >= 0) or (SSig.CompareTo(N) >= 0)) then
+  begin
+    result := false;
+    Exit;
+  end;
+
+  PublicKey := (FKey as IECPublicKeyParameters);
+  PublicKeyBytes := PublicKey.Q.GetEncoded(true);
+
+  input := TArrayUtils.Concatenate(TBigIntegers.BigIntegerToBytes(RSig,
+    numBytes), TCryptoLibMatrixByteArray.Create(PublicKeyBytes, &message));
+
+  e := TBigInteger.Create(1, TDigestUtilities.DoFinal(FDigest, input)).&Mod(N);
+  Q := PublicKey.Q.Normalize();
+  P := Curve.CreatePoint(Q.XCoord.ToBigInteger(), Q.YCoord.ToBigInteger());
+
+  r := G.Multiply(SSig).Add(P.Multiply(N.Subtract(e))).Normalize();
+
+  if ((r.IsInfinity) or (r.XCoord.ToBigInteger().CompareTo(RSig) <> 0) or
+    (TBigInteger.Jacobi(r.YCoord.ToBigInteger(), PP) <> 1)) then
+  begin
+    result := false;
+    Exit;
+  end;
+
+  result := true;
+end;
+
+end.

+ 0 - 1
CryptoLib/src/Crypto/Signers/ClpPlainDsaEncoding.pas

@@ -23,7 +23,6 @@ interface
 
 
 uses
 uses
   Math,
   Math,
-  ClpIDerInteger,
   ClpBigInteger,
   ClpBigInteger,
   ClpIDsaEncoding,
   ClpIDsaEncoding,
   ClpIPlainDsaEncoding,
   ClpIPlainDsaEncoding,

+ 139 - 0
CryptoLib/src/Crypto/Signers/ClpPlainSchnorrEncoding.pas

@@ -0,0 +1,139 @@
+{ *********************************************************************************** }
+{ *                              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 ClpPlainSchnorrEncoding;
+
+{$I ..\..\Include\CryptoLib.inc}
+
+interface
+
+uses
+  Math,
+  ClpBigInteger,
+  ClpISchnorrEncoding,
+  ClpIPlainSchnorrEncoding,
+  ClpBigIntegers,
+  ClpArrayUtils,
+  ClpCryptoLibTypes;
+
+resourcestring
+  SInvalidEncodingLength = 'Encoding has incorrect length, "%s"';
+  SValueOutOfRange = 'Value out of range, "%s"';
+
+type
+  TPlainSchnorrEncoding = class(TInterfacedObject, ISchnorrEncoding,
+    IPlainSchnorrEncoding)
+
+  strict private
+    class var
+
+      FInstance: IPlainSchnorrEncoding;
+
+    class function GetInstance: IPlainSchnorrEncoding; static; inline;
+
+    class constructor PlainSchnorrEncoding();
+
+  strict protected
+
+    function CheckValue(const n, x: TBigInteger): TBigInteger; virtual;
+    function DecodeValue(const n: TBigInteger; const buf: TCryptoLibByteArray;
+      off, len: Int32): TBigInteger; virtual;
+    procedure EncodeValue(const n, x: TBigInteger;
+      const buf: TCryptoLibByteArray; off, len: Int32); virtual;
+
+  public
+
+    function Decode(const n: TBigInteger; const encoding: TCryptoLibByteArray)
+      : TCryptoLibGenericArray<TBigInteger>; virtual;
+
+    function Encode(const n, r, s: TBigInteger): TCryptoLibByteArray; virtual;
+
+    class property Instance: IPlainSchnorrEncoding read GetInstance;
+
+  end;
+
+implementation
+
+{ TPlainDsaEncoding }
+
+function TPlainSchnorrEncoding.CheckValue(const n, x: TBigInteger): TBigInteger;
+begin
+  if ((x.SignValue < 0) or ((x.CompareTo(n) >= 0))) then
+  begin
+    raise EArgumentCryptoLibException.CreateResFmt(@SValueOutOfRange, ['x']);
+  end;
+  result := x;
+end;
+
+function TPlainSchnorrEncoding.Decode(const n: TBigInteger;
+  const encoding: TCryptoLibByteArray): TCryptoLibGenericArray<TBigInteger>;
+var
+  valueLength: Int32;
+begin
+  valueLength := TBigIntegers.GetUnsignedByteLength(n);
+  if (System.Length(encoding) <> (valueLength * 2)) then
+  begin
+    raise EArgumentCryptoLibException.CreateResFmt(@SInvalidEncodingLength,
+      ['encoding']);
+  end;
+  result := TCryptoLibGenericArray<TBigInteger>.Create
+    (DecodeValue(n, encoding, 0, valueLength), DecodeValue(n, encoding,
+    valueLength, valueLength));
+end;
+
+function TPlainSchnorrEncoding.DecodeValue(const n: TBigInteger;
+  const buf: TCryptoLibByteArray; off, len: Int32): TBigInteger;
+begin
+  result := CheckValue(n, TBigInteger.Create(1, buf, off, len));
+end;
+
+function TPlainSchnorrEncoding.Encode(const n, r, s: TBigInteger)
+  : TCryptoLibByteArray;
+var
+  valueLength: Int32;
+begin
+  valueLength := TBigIntegers.GetUnsignedByteLength(n);
+  System.SetLength(result, valueLength * 2);
+  EncodeValue(n, r, result, 0, valueLength);
+  EncodeValue(n, s, result, valueLength, valueLength);
+end;
+
+procedure TPlainSchnorrEncoding.EncodeValue(const n, x: TBigInteger;
+  const buf: TCryptoLibByteArray; off, len: Int32);
+var
+  bs: TCryptoLibByteArray;
+  bsOff, bsLen, pos: Int32;
+begin
+  bs := CheckValue(n, x).ToByteArrayUnsigned();
+  bsOff := Max(0, System.Length(bs) - len);
+  bsLen := System.Length(bs) - bsOff;
+  pos := len - bsLen;
+  TArrayUtils.Fill(buf, off, off + pos, Byte(0));
+  System.Move(bs[bsOff], buf[off + pos], bsLen * System.SizeOf(Byte));
+end;
+
+class function TPlainSchnorrEncoding.GetInstance: IPlainSchnorrEncoding;
+begin
+  result := FInstance;
+end;
+
+class constructor TPlainSchnorrEncoding.PlainSchnorrEncoding;
+begin
+  FInstance := TPlainSchnorrEncoding.Create();
+end;
+
+end.

+ 254 - 0
CryptoLib/src/Crypto/Signers/ClpSchnorrDigestSigner.pas

@@ -0,0 +1,254 @@
+{ *********************************************************************************** }
+{ *                              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 ClpSchnorrDigestSigner;
+
+{$I ..\..\Include\CryptoLib.inc}
+
+interface
+
+uses
+
+  SysUtils,
+  Classes,
+  ClpISchnorr,
+  ClpISchnorrExt,
+  ClpISchnorrEncoding,
+  ClpISchnorrDigestSigner,
+  ClpIDigest,
+  ClpBigInteger,
+  ClpCryptoLibTypes,
+  ClpIParametersWithRandom,
+  ClpStandardDsaEncoding,
+  ClpIAsymmetricKeyParameter,
+  ClpICipherParameters,
+  ClpISigner,
+  ClpArrayUtils;
+
+resourcestring
+  SPrivateKey = 'Signing Requires Private Key.';
+  SPublicKey = 'Verification Requires Public Key.';
+  SSchnorrDigestSignerNotInitializedForSignatureGeneration =
+    'SchnorrDigestSigner not Initialized for Signature Generation.';
+  SSchnorrDigestSignerNotInitializedForVerification =
+    'SchnorrDigestSigner not Initialized for Verification';
+  SEncodingError = 'Unable to Encode Signature';
+
+type
+  TSchnorrDigestSigner = class(TInterfacedObject, ISigner, ISchnorrDigestSigner)
+
+  strict private
+  var
+    FDigest: IDigest;
+    FSchnorr: ISchnorr;
+    FForSigning: Boolean;
+    FEncoding: ISchnorrEncoding;
+    FBuffer: TMemoryStream;
+
+    function Aggregate: TCryptoLibByteArray; inline;
+
+  strict protected
+
+    function GetOrder(): TBigInteger; virtual;
+
+  public
+    // constructor Create(const Schnorr: ISchnorr; const digest: IDigest);
+    // overload;
+    constructor Create(const Schnorr: ISchnorrExt; const digest: IDigest;
+      const encoding: ISchnorrEncoding);
+    destructor Destroy(); override;
+
+    function GetAlgorithmName: String; virtual;
+    property AlgorithmName: String read GetAlgorithmName;
+
+    procedure Init(forSigning: Boolean;
+      const parameters: ICipherParameters); virtual;
+
+    /// <summary>
+    /// update the internal digest with the byte b
+    /// </summary>
+    procedure Update(input: Byte); virtual;
+
+    /// <summary>
+    /// update the internal digest with the byte array in
+    /// </summary>
+    procedure BlockUpdate(const input: TCryptoLibByteArray;
+      inOff, length: Int32); virtual;
+
+    /// <summary>
+    /// Generate a signature for the message we've been loaded with using the
+    /// key we were initialised with.
+    /// </summary>
+    function GenerateSignature(): TCryptoLibByteArray; virtual;
+
+    /// <returns>
+    /// true if the internal state represents the signature described in the
+    /// passed in array.
+    /// </returns>
+    function VerifySignature(const signature: TCryptoLibByteArray)
+      : Boolean; virtual;
+
+    /// <summary>
+    /// Reset the internal state
+    /// </summary>
+    procedure Reset(); virtual;
+
+  end;
+
+implementation
+
+{ TSchnorrDigestSigner }
+
+function TSchnorrDigestSigner.Aggregate: TCryptoLibByteArray;
+begin
+  FBuffer.Position := 0;
+  System.SetLength(Result, FBuffer.Size);
+  FBuffer.Read(Result[0], FBuffer.Size);
+end;
+
+procedure TSchnorrDigestSigner.BlockUpdate(const input: TCryptoLibByteArray;
+  inOff, length: Int32);
+begin
+  FBuffer.Write(input[inOff], length);
+end;
+
+// constructor TSchnorrDigestSigner.Create(const Schnorr: ISchnorr;
+// const digest: IDigest);
+// begin
+// Inherited Create();
+// FSchnorr := Schnorr;
+// FDigest := digest;
+// FBuffer := TMemoryStream.Create();
+// end;
+
+constructor TSchnorrDigestSigner.Create(const Schnorr: ISchnorrExt;
+  const digest: IDigest; const encoding: ISchnorrEncoding);
+begin
+  Inherited Create();
+  FSchnorr := Schnorr;
+  FDigest := digest;
+  FEncoding := encoding;
+  FBuffer := TMemoryStream.Create();
+end;
+
+destructor TSchnorrDigestSigner.Destroy;
+begin
+  FBuffer.Free;
+  inherited Destroy;
+end;
+
+function TSchnorrDigestSigner.GenerateSignature: TCryptoLibByteArray;
+var
+  sig: TCryptoLibGenericArray<TBigInteger>;
+begin
+  if ((not FForSigning)) then
+  begin
+    raise EInvalidOperationCryptoLibException.CreateRes
+      (@SSchnorrDigestSignerNotInitializedForSignatureGeneration);
+  end;
+
+  sig := FSchnorr.GenerateSignature(Aggregate());
+
+  try
+    Result := FEncoding.Encode(GetOrder(), sig[0], sig[1]);
+  except
+    raise EInvalidOperationCryptoLibException.CreateRes(@SEncodingError);
+  end;
+end;
+
+function TSchnorrDigestSigner.GetAlgorithmName: String;
+begin
+  Result := FDigest.AlgorithmName + 'with' + FSchnorr.AlgorithmName;
+end;
+
+function TSchnorrDigestSigner.GetOrder: TBigInteger;
+begin
+  if Supports(FSchnorr, ISchnorrExt) then
+  begin
+    Result := (FSchnorr as ISchnorrExt).Order;
+  end
+  else
+  begin
+    Result := Default (TBigInteger);
+  end;
+end;
+
+procedure TSchnorrDigestSigner.Init(forSigning: Boolean;
+  const parameters: ICipherParameters);
+var
+  k: IAsymmetricKeyParameter;
+  withRandom: IParametersWithRandom;
+begin
+  FForSigning := forSigning;
+
+  if (Supports(parameters, IParametersWithRandom, withRandom)) then
+  begin
+    k := withRandom.parameters as IAsymmetricKeyParameter;
+  end
+  else
+  begin
+    k := parameters as IAsymmetricKeyParameter;
+  end;
+
+  if ((forSigning) and (not k.IsPrivate)) then
+  begin
+    raise EInvalidKeyCryptoLibException.CreateRes(@SPrivateKey);
+  end;
+
+  if ((not forSigning) and (k.IsPrivate)) then
+  begin
+    raise EInvalidKeyCryptoLibException.CreateRes(@SPublicKey);
+  end;
+
+  Reset();
+
+  FSchnorr.Init(forSigning, parameters, FDigest);
+end;
+
+procedure TSchnorrDigestSigner.Reset;
+begin
+  FDigest.Reset;
+  FBuffer.Clear;
+  FBuffer.SetSize(0);
+end;
+
+procedure TSchnorrDigestSigner.Update(input: Byte);
+begin
+  FBuffer.Write(TCryptoLibByteArray.Create(input)[0], 1);
+end;
+
+function TSchnorrDigestSigner.VerifySignature(const signature
+  : TCryptoLibByteArray): Boolean;
+var
+  sig: TCryptoLibGenericArray<TBigInteger>;
+begin
+  if (FForSigning) then
+  begin
+    raise EInvalidOperationCryptoLibException.CreateRes
+      (@SSchnorrDigestSignerNotInitializedForVerification);
+  end;
+
+  try
+    sig := FEncoding.Decode(GetOrder(), signature);
+    Result := FSchnorr.VerifySignature(Aggregate(), sig[0], sig[1]);
+  except
+    Result := false;
+  end;
+
+end;
+
+end.

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

@@ -1,35 +0,0 @@
-{ *********************************************************************************** }
-{ *                              CryptoLib Library                                  * }
-{ *                Copyright (c) 2018 - 20XX Ugochukwu Mmaduekwe                    * }
-{ *                 Github Repository <https://github.com/Xor-el>                   * }
-
-{ *  Distributed under the MIT software license, see the accompanying file LICENSE  * }
-{ *          or visit http://www.opensource.org/licenses/mit-license.php.           * }
-
-{ *                              Acknowledgements:                                  * }
-{ *                                                                                 * }
-{ *      Thanks to Sphere 10 Software (http://www.sphere10.com/) for sponsoring     * }
-{ *                           development of this library                           * }
-
-{ * ******************************************************************************* * }
-
-(* &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& *)
-
-unit ClpIECSchnorrLIBSECPSigner;
-
-{$I ..\Include\CryptoLib.inc}
-
-interface
-
-uses
-  ClpISchnorr;
-
-type
-  IECSchnorrLIBSECPSigner = interface(ISchnorr)
-
-    ['{AE748071-90D2-4EE5-9721-E69286BCC359}']
-  end;
-
-implementation
-
-end.

+ 4 - 4
CryptoLib/src/Interfaces/ClpIECSchnorrBSISigner.pas → CryptoLib/src/Interfaces/ClpIECSchnorrSipaSigner.pas

@@ -15,19 +15,19 @@
 
 
 (* &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& *)
 (* &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& *)
 
 
-unit ClpIECSchnorrBSISigner;
+unit ClpIECSchnorrSipaSigner;
 
 
 {$I ..\Include\CryptoLib.inc}
 {$I ..\Include\CryptoLib.inc}
 
 
 interface
 interface
 
 
 uses
 uses
-  ClpISchnorr;
+  ClpISchnorrExt;
 
 
 type
 type
-  IECSchnorrBSISigner = interface(ISchnorr)
+  IECSchnorrSipaSigner = interface(ISchnorrExt)
+    ['{8941641A-4EF7-4BC7-96FC-F6E98F418DC8}']
 
 
-    ['{799FABB1-D1BB-4B58-9E49-CF1CD8142554}']
   end;
   end;
 
 
 implementation
 implementation

+ 17 - 4
CryptoLib/src/Interfaces/ClpIECSchnorrISOXSigner.pas → CryptoLib/src/Interfaces/ClpIPlainSchnorrEncoding.pas

@@ -15,19 +15,32 @@
 
 
 (* &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& *)
 (* &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& *)
 
 
-unit ClpIECSchnorrISOXSigner;
+unit ClpIPlainSchnorrEncoding;
 
 
 {$I ..\Include\CryptoLib.inc}
 {$I ..\Include\CryptoLib.inc}
 
 
 interface
 interface
 
 
 uses
 uses
-  ClpISchnorr;
+  ClpBigInteger,
+  ClpISchnorrEncoding,
+  ClpCryptoLibTypes;
 
 
 type
 type
-  IECSchnorrISOXSigner = interface(ISchnorr)
+  IPlainSchnorrEncoding = interface(ISchnorrEncoding)
+    ['{1C2D1D11-04C4-4438-B728-4BF3ED2F3E99}']
+
+    function CheckValue(const n, x: TBigInteger): TBigInteger;
+    function DecodeValue(const n: TBigInteger; const buf: TCryptoLibByteArray;
+      off, len: Int32): TBigInteger;
+    procedure EncodeValue(const n, x: TBigInteger;
+      const buf: TCryptoLibByteArray; off, len: Int32);
+
+    function Decode(const n: TBigInteger; const encoding: TCryptoLibByteArray)
+      : TCryptoLibGenericArray<TBigInteger>;
+
+    function Encode(const n, r, s: TBigInteger): TCryptoLibByteArray;
 
 
-    ['{D9BC810A-0554-4D54-A6D8-5350667BB3D5}']
   end;
   end;
 
 
 implementation
 implementation

+ 12 - 9
CryptoLib/src/Interfaces/ClpISchnorr.pas

@@ -22,26 +22,29 @@ unit ClpISchnorr;
 interface
 interface
 
 
 uses
 uses
-  ClpIECPrivateKeyParameters,
-  ClpIECPublicKeyParameters,
   ClpIDigest,
   ClpIDigest,
   ClpBigInteger,
   ClpBigInteger,
+  ClpICipherParameters,
   ClpCryptoLibTypes;
   ClpCryptoLibTypes;
 
 
 type
 type
+  /// <summary>
+  /// interface for classes implementing the Schnorr Signature Algorithm
+  /// </summary>
   ISchnorr = interface(IInterface)
   ISchnorr = interface(IInterface)
-    ['{D3E88536-CE8D-4933-ADD8-235CAD65819F}']
+    ['{B8065C83-1164-4DD0-B983-8CF840F120EF}']
 
 
     function GetAlgorithmName: String;
     function GetAlgorithmName: String;
     property AlgorithmName: String read GetAlgorithmName;
     property AlgorithmName: String read GetAlgorithmName;
 
 
-    function Do_Sign(const &message: TCryptoLibByteArray; const digest: IDigest;
-      const pv_key: IECPrivateKeyParameters; const k: TBigInteger)
-      : TCryptoLibByteArray;
+    procedure Init(forSigning: Boolean; const parameters: ICipherParameters;
+      const digest: IDigest);
 
 
-    function Do_Verify(const &message: TCryptoLibByteArray;
-      const digest: IDigest; const pu_key: IECPublicKeyParameters;
-      const sig: TCryptoLibByteArray): Boolean;
+    function GenerateSignature(const &message: TCryptoLibByteArray)
+      : TCryptoLibGenericArray<TBigInteger>;
+
+    function VerifySignature(const &message: TCryptoLibByteArray;
+      const r, s: TBigInteger): Boolean;
 
 
   end;
   end;
 
 

+ 8 - 4
CryptoLib/src/Interfaces/ClpIECSchnorrISOSigner.pas → CryptoLib/src/Interfaces/ClpISchnorrDigestSigner.pas

@@ -15,19 +15,23 @@
 
 
 (* &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& *)
 (* &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& *)
 
 
-unit ClpIECSchnorrISOSigner;
+unit ClpISchnorrDigestSigner;
 
 
 {$I ..\Include\CryptoLib.inc}
 {$I ..\Include\CryptoLib.inc}
 
 
 interface
 interface
 
 
 uses
 uses
-  ClpISchnorr;
+  ClpISigner,
+  ClpBigInteger;
 
 
 type
 type
-  IECSchnorrISOSigner = interface(ISchnorr)
 
 
-    ['{B3E5638F-0D51-4D3F-9505-5B240D894229}']
+  ISchnorrDigestSigner = interface(ISigner)
+    ['{FD48778F-A071-459A-9008-423566240F09}']
+
+    function GetOrder(): TBigInteger;
+
   end;
   end;
 
 
 implementation
 implementation

+ 52 - 0
CryptoLib/src/Interfaces/ClpISchnorrEncoding.pas

@@ -0,0 +1,52 @@
+{ *********************************************************************************** }
+{ *                              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 ClpISchnorrEncoding;
+
+{$I ..\Include\CryptoLib.inc}
+
+interface
+
+uses
+  ClpBigInteger,
+  ClpCryptoLibTypes;
+
+type
+  /// <summary>
+  /// An interface for different encoding formats for Schnorr signatures.
+  /// </summary>
+  ISchnorrEncoding = interface(IInterface)
+    ['{CC5ECEFB-D806-402F-9F86-8D17EC61BE00}']
+
+    /// <summary>Decode the (r, s) pair of a Schnorr signature.</summary>
+    /// <param name="n">The order of the group that r, s belong to.</param>
+    /// <param name="encoding">An encoding of the (r, s) pair of a Schnorr signature.</param>
+    /// <returns>The (r, s) of a Schnorr signature, stored in an array of exactly two elements, r followed by s.</returns>
+    function Decode(const n: TBigInteger; const encoding: TCryptoLibByteArray)
+      : TCryptoLibGenericArray<TBigInteger>;
+    /// <summary>Encode the (r, s) pair of a Schnorr signature.</summary>
+    /// <param name="n">The order of the group that r, s belong to.</param>
+    /// <param name="r">The r value of a Schnorr signature.</param>
+    /// <param name="s">The s value of a Schnorr signature.</param>
+    /// <returns>An encoding of the Schnorr signature given by the provided (r, s) pair.</returns>
+    function Encode(const n, r, s: TBigInteger): TCryptoLibByteArray;
+
+  end;
+
+implementation
+
+end.

+ 13 - 14
CryptoLib/src/Interfaces/ClpIECSchnorrSigner.pas → CryptoLib/src/Interfaces/ClpISchnorrExt.pas

@@ -15,28 +15,27 @@
 
 
 (* &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& *)
 (* &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& *)
 
 
-unit ClpIECSchnorrSigner;
+unit ClpISchnorrExt;
 
 
 {$I ..\Include\CryptoLib.inc}
 {$I ..\Include\CryptoLib.inc}
 
 
 interface
 interface
 
 
 uses
 uses
-  ClpISigner,
-  ClpIECPublicKeyParameters,
-  ClpIECPrivateKeyParameters,
-  ClpBigInteger,
-  ClpCryptoLibTypes;
+  ClpISchnorr,
+  ClpBigInteger;
 
 
 type
 type
-  IECSchnorrSigner = interface(ISigner)
-    ['{A941F9C5-81BE-4F0D-9294-2488C21035E3}']
-
-    function Do_Sign(const pv_key: IECPrivateKeyParameters;
-      const k: TBigInteger): TCryptoLibByteArray;
-
-    function Do_Verify(const pu_key: IECPublicKeyParameters;
-      const sig: TCryptoLibByteArray): Boolean;
+  /// <summary>
+  /// An "extended" interface for classes implementing Schnorr-style algorithms, that provides access
+  /// to the group order.
+  /// </summary>
+  ISchnorrExt = interface(ISchnorr)
+    ['{0BCED764-F352-4C6C-B30C-9E0D7A2B042B}']
+
+    function GetOrder: TBigInteger;
+    /// <summary>The order of the group that the r, s values in signatures belong to.</summary>
+    property Order: TBigInteger read GetOrder;
 
 
   end;
   end;
 
 

+ 382 - 390
CryptoLib/src/Packages/FPC/CryptoLib4PascalPackage.lpk

@@ -24,8 +24,8 @@
 
 
  Acknowledgements: 
  Acknowledgements: 
 Thanks to Sphere 10 Software (http://www.sphere10.com/) for sponsoring the development of this library "/>
 Thanks to Sphere 10 Software (http://www.sphere10.com/) for sponsoring the development of this library "/>
-    <Version Major="2" Minor="5"/>
-    <Files Count="461">
+    <Version Major="2" Minor="6"/>
+    <Files Count="459">
       <Item1>
       <Item1>
         <Filename Value="..\..\Asn1\ClpAsn1Encodable.pas"/>
         <Filename Value="..\..\Asn1\ClpAsn1Encodable.pas"/>
         <UnitName Value="ClpAsn1Encodable"/>
         <UnitName Value="ClpAsn1Encodable"/>
@@ -1107,771 +1107,763 @@ Thanks to Sphere 10 Software (http://www.sphere10.com/) for sponsoring the devel
         <UnitName Value="ClpDefiniteLengthInputStream"/>
         <UnitName Value="ClpDefiniteLengthInputStream"/>
       </Item270>
       </Item270>
       <Item271>
       <Item271>
-        <Filename Value="..\..\Crypto\Signers\ClpECSchnorrSigner.pas"/>
-        <UnitName Value="ClpECSchnorrSigner"/>
+        <Filename Value="..\..\Security\ClpParameterUtilities.pas"/>
+        <UnitName Value="ClpParameterUtilities"/>
       </Item271>
       </Item271>
       <Item272>
       <Item272>
-        <Filename Value="..\..\Interfaces\ClpIECSchnorrSigner.pas"/>
-        <UnitName Value="ClpIECSchnorrSigner"/>
+        <Filename Value="..\..\Security\ClpGeneratorUtilities.pas"/>
+        <UnitName Value="ClpGeneratorUtilities"/>
       </Item272>
       </Item272>
       <Item273>
       <Item273>
-        <Filename Value="..\..\Security\ClpParameterUtilities.pas"/>
-        <UnitName Value="ClpParameterUtilities"/>
+        <Filename Value="..\..\Security\ClpCipherUtilities.pas"/>
+        <UnitName Value="ClpCipherUtilities"/>
       </Item273>
       </Item273>
       <Item274>
       <Item274>
-        <Filename Value="..\..\Security\ClpGeneratorUtilities.pas"/>
-        <UnitName Value="ClpGeneratorUtilities"/>
+        <Filename Value="..\..\Interfaces\ClpIAesEngine.pas"/>
+        <UnitName Value="ClpIAesEngine"/>
       </Item274>
       </Item274>
       <Item275>
       <Item275>
-        <Filename Value="..\..\Security\ClpCipherUtilities.pas"/>
-        <UnitName Value="ClpCipherUtilities"/>
+        <Filename Value="..\..\Interfaces\ClpIPkcs7Padding.pas"/>
+        <UnitName Value="ClpIPkcs7Padding"/>
       </Item275>
       </Item275>
       <Item276>
       <Item276>
-        <Filename Value="..\..\Interfaces\ClpIAesEngine.pas"/>
-        <UnitName Value="ClpIAesEngine"/>
+        <Filename Value="..\..\Interfaces\ClpIParametersWithIV.pas"/>
+        <UnitName Value="ClpIParametersWithIV"/>
       </Item276>
       </Item276>
       <Item277>
       <Item277>
-        <Filename Value="..\..\Interfaces\ClpIPkcs7Padding.pas"/>
-        <UnitName Value="ClpIPkcs7Padding"/>
+        <Filename Value="..\..\Interfaces\ClpIPaddedBufferedBlockCipher.pas"/>
+        <UnitName Value="ClpIPaddedBufferedBlockCipher"/>
       </Item277>
       </Item277>
       <Item278>
       <Item278>
-        <Filename Value="..\..\Interfaces\ClpIParametersWithIV.pas"/>
-        <UnitName Value="ClpIParametersWithIV"/>
+        <Filename Value="..\..\Interfaces\ClpIKeyParameter.pas"/>
+        <UnitName Value="ClpIKeyParameter"/>
       </Item278>
       </Item278>
       <Item279>
       <Item279>
-        <Filename Value="..\..\Interfaces\ClpIPaddedBufferedBlockCipher.pas"/>
-        <UnitName Value="ClpIPaddedBufferedBlockCipher"/>
+        <Filename Value="..\..\Interfaces\ClpICbcBlockCipher.pas"/>
+        <UnitName Value="ClpICbcBlockCipher"/>
       </Item279>
       </Item279>
       <Item280>
       <Item280>
-        <Filename Value="..\..\Interfaces\ClpIKeyParameter.pas"/>
-        <UnitName Value="ClpIKeyParameter"/>
+        <Filename Value="..\..\Interfaces\ClpIBufferedCipherBase.pas"/>
+        <UnitName Value="ClpIBufferedCipherBase"/>
       </Item280>
       </Item280>
       <Item281>
       <Item281>
-        <Filename Value="..\..\Interfaces\ClpICbcBlockCipher.pas"/>
-        <UnitName Value="ClpICbcBlockCipher"/>
+        <Filename Value="..\..\Interfaces\ClpIBufferedCipher.pas"/>
+        <UnitName Value="ClpIBufferedCipher"/>
       </Item281>
       </Item281>
       <Item282>
       <Item282>
-        <Filename Value="..\..\Interfaces\ClpIBufferedCipherBase.pas"/>
-        <UnitName Value="ClpIBufferedCipherBase"/>
+        <Filename Value="..\..\Interfaces\ClpIBufferedBlockCipher.pas"/>
+        <UnitName Value="ClpIBufferedBlockCipher"/>
       </Item282>
       </Item282>
       <Item283>
       <Item283>
-        <Filename Value="..\..\Interfaces\ClpIBufferedCipher.pas"/>
-        <UnitName Value="ClpIBufferedCipher"/>
+        <Filename Value="..\..\Interfaces\ClpIBlockCipherPadding.pas"/>
+        <UnitName Value="ClpIBlockCipherPadding"/>
       </Item283>
       </Item283>
       <Item284>
       <Item284>
-        <Filename Value="..\..\Interfaces\ClpIBufferedBlockCipher.pas"/>
-        <UnitName Value="ClpIBufferedBlockCipher"/>
+        <Filename Value="..\..\Interfaces\ClpIBlockCipher.pas"/>
+        <UnitName Value="ClpIBlockCipher"/>
       </Item284>
       </Item284>
       <Item285>
       <Item285>
-        <Filename Value="..\..\Interfaces\ClpIBlockCipherPadding.pas"/>
-        <UnitName Value="ClpIBlockCipherPadding"/>
+        <Filename Value="..\..\Crypto\Modes\ClpCbcBlockCipher.pas"/>
+        <UnitName Value="ClpCbcBlockCipher"/>
       </Item285>
       </Item285>
       <Item286>
       <Item286>
-        <Filename Value="..\..\Interfaces\ClpIBlockCipher.pas"/>
-        <UnitName Value="ClpIBlockCipher"/>
+        <Filename Value="..\..\Crypto\Paddings\ClpPaddedBufferedBlockCipher.pas"/>
+        <UnitName Value="ClpPaddedBufferedBlockCipher"/>
       </Item286>
       </Item286>
       <Item287>
       <Item287>
-        <Filename Value="..\..\Crypto\Modes\ClpCbcBlockCipher.pas"/>
-        <UnitName Value="ClpCbcBlockCipher"/>
+        <Filename Value="..\..\Crypto\Paddings\ClpPkcs7Padding.pas"/>
+        <UnitName Value="ClpPkcs7Padding"/>
       </Item287>
       </Item287>
       <Item288>
       <Item288>
-        <Filename Value="..\..\Crypto\Paddings\ClpPaddedBufferedBlockCipher.pas"/>
-        <UnitName Value="ClpPaddedBufferedBlockCipher"/>
+        <Filename Value="..\..\Crypto\Parameters\ClpParametersWithIV.pas"/>
+        <UnitName Value="ClpParametersWithIV"/>
       </Item288>
       </Item288>
       <Item289>
       <Item289>
-        <Filename Value="..\..\Crypto\Paddings\ClpPkcs7Padding.pas"/>
-        <UnitName Value="ClpPkcs7Padding"/>
+        <Filename Value="..\..\Crypto\Parameters\ClpKeyParameter.pas"/>
+        <UnitName Value="ClpKeyParameter"/>
       </Item289>
       </Item289>
       <Item290>
       <Item290>
-        <Filename Value="..\..\Crypto\Parameters\ClpParametersWithIV.pas"/>
-        <UnitName Value="ClpParametersWithIV"/>
+        <Filename Value="..\..\Crypto\ClpBufferedBlockCipher.pas"/>
+        <UnitName Value="ClpBufferedBlockCipher"/>
       </Item290>
       </Item290>
       <Item291>
       <Item291>
-        <Filename Value="..\..\Crypto\Parameters\ClpKeyParameter.pas"/>
-        <UnitName Value="ClpKeyParameter"/>
+        <Filename Value="..\..\Crypto\ClpBufferedCipherBase.pas"/>
+        <UnitName Value="ClpBufferedCipherBase"/>
       </Item291>
       </Item291>
       <Item292>
       <Item292>
-        <Filename Value="..\..\Crypto\ClpBufferedBlockCipher.pas"/>
-        <UnitName Value="ClpBufferedBlockCipher"/>
+        <Filename Value="..\..\Utils\ClpCheck.pas"/>
+        <UnitName Value="ClpCheck"/>
       </Item292>
       </Item292>
       <Item293>
       <Item293>
-        <Filename Value="..\..\Crypto\ClpBufferedCipherBase.pas"/>
-        <UnitName Value="ClpBufferedCipherBase"/>
+        <Filename Value="..\..\Crypto\Engines\ClpAesEngine.pas"/>
+        <UnitName Value="ClpAesEngine"/>
       </Item293>
       </Item293>
       <Item294>
       <Item294>
-        <Filename Value="..\..\Utils\ClpCheck.pas"/>
-        <UnitName Value="ClpCheck"/>
+        <Filename Value="..\..\Crypto\Generators\ClpPascalCoinECIESKdfBytesGenerator.pas"/>
+        <UnitName Value="ClpPascalCoinECIESKdfBytesGenerator"/>
       </Item294>
       </Item294>
       <Item295>
       <Item295>
-        <Filename Value="..\..\Crypto\Engines\ClpAesEngine.pas"/>
-        <UnitName Value="ClpAesEngine"/>
+        <Filename Value="..\..\Crypto\Engines\ClpPascalCoinIESEngine.pas"/>
+        <UnitName Value="ClpPascalCoinIESEngine"/>
       </Item295>
       </Item295>
       <Item296>
       <Item296>
-        <Filename Value="..\..\Crypto\Generators\ClpPascalCoinECIESKdfBytesGenerator.pas"/>
-        <UnitName Value="ClpPascalCoinECIESKdfBytesGenerator"/>
+        <Filename Value="..\..\Crypto\Generators\ClpBaseKdfBytesGenerator.pas"/>
+        <UnitName Value="ClpBaseKdfBytesGenerator"/>
       </Item296>
       </Item296>
       <Item297>
       <Item297>
-        <Filename Value="..\..\Crypto\Engines\ClpPascalCoinIESEngine.pas"/>
-        <UnitName Value="ClpPascalCoinIESEngine"/>
+        <Filename Value="..\..\Crypto\Engines\ClpIESEngine.pas"/>
+        <UnitName Value="ClpIESEngine"/>
       </Item297>
       </Item297>
       <Item298>
       <Item298>
-        <Filename Value="..\..\Crypto\Generators\ClpBaseKdfBytesGenerator.pas"/>
-        <UnitName Value="ClpBaseKdfBytesGenerator"/>
+        <Filename Value="..\..\Crypto\Parsers\ClpECIESPublicKeyParser.pas"/>
+        <UnitName Value="ClpECIESPublicKeyParser"/>
       </Item298>
       </Item298>
       <Item299>
       <Item299>
-        <Filename Value="..\..\Crypto\Engines\ClpIESEngine.pas"/>
-        <UnitName Value="ClpIESEngine"/>
+        <Filename Value="..\..\Crypto\ClpIESCipher.pas"/>
+        <UnitName Value="ClpIESCipher"/>
       </Item299>
       </Item299>
       <Item300>
       <Item300>
-        <Filename Value="..\..\Crypto\Parsers\ClpECIESPublicKeyParser.pas"/>
-        <UnitName Value="ClpECIESPublicKeyParser"/>
+        <Filename Value="..\..\Crypto\Agreement\ClpECDHBasicAgreement.pas"/>
+        <UnitName Value="ClpECDHBasicAgreement"/>
       </Item300>
       </Item300>
       <Item301>
       <Item301>
-        <Filename Value="..\..\Crypto\ClpIESCipher.pas"/>
-        <UnitName Value="ClpIESCipher"/>
+        <Filename Value="..\..\Crypto\ClpEphemeralKeyPair.pas"/>
+        <UnitName Value="ClpEphemeralKeyPair"/>
       </Item301>
       </Item301>
       <Item302>
       <Item302>
-        <Filename Value="..\..\Crypto\Agreement\ClpECDHBasicAgreement.pas"/>
-        <UnitName Value="ClpECDHBasicAgreement"/>
+        <Filename Value="..\..\Crypto\ClpKeyEncoder.pas"/>
+        <UnitName Value="ClpKeyEncoder"/>
       </Item302>
       </Item302>
       <Item303>
       <Item303>
-        <Filename Value="..\..\Crypto\ClpEphemeralKeyPair.pas"/>
-        <UnitName Value="ClpEphemeralKeyPair"/>
+        <Filename Value="..\..\Crypto\Paddings\ClpZeroBytePadding.pas"/>
+        <UnitName Value="ClpZeroBytePadding"/>
       </Item303>
       </Item303>
       <Item304>
       <Item304>
-        <Filename Value="..\..\Crypto\ClpKeyEncoder.pas"/>
-        <UnitName Value="ClpKeyEncoder"/>
+        <Filename Value="..\..\Crypto\Parameters\ClpIESWithCipherParameters.pas"/>
+        <UnitName Value="ClpIESWithCipherParameters"/>
       </Item304>
       </Item304>
       <Item305>
       <Item305>
-        <Filename Value="..\..\Crypto\Paddings\ClpZeroBytePadding.pas"/>
-        <UnitName Value="ClpZeroBytePadding"/>
+        <Filename Value="..\..\Crypto\Parameters\ClpIESParameters.pas"/>
+        <UnitName Value="ClpIESParameters"/>
       </Item305>
       </Item305>
       <Item306>
       <Item306>
-        <Filename Value="..\..\Crypto\Parameters\ClpIESWithCipherParameters.pas"/>
-        <UnitName Value="ClpIESWithCipherParameters"/>
+        <Filename Value="..\..\Crypto\Generators\ClpEphemeralKeyPairGenerator.pas"/>
+        <UnitName Value="ClpEphemeralKeyPairGenerator"/>
       </Item306>
       </Item306>
       <Item307>
       <Item307>
-        <Filename Value="..\..\Crypto\Parameters\ClpIESParameters.pas"/>
-        <UnitName Value="ClpIESParameters"/>
+        <Filename Value="..\..\Crypto\Generators\ClpKdf2BytesGenerator.pas"/>
+        <UnitName Value="ClpKdf2BytesGenerator"/>
       </Item307>
       </Item307>
       <Item308>
       <Item308>
-        <Filename Value="..\..\Crypto\Generators\ClpEphemeralKeyPairGenerator.pas"/>
-        <UnitName Value="ClpEphemeralKeyPairGenerator"/>
+        <Filename Value="..\..\Crypto\Parameters\ClpIso18033KdfParameters.pas"/>
+        <UnitName Value="ClpIso18033KdfParameters"/>
       </Item308>
       </Item308>
       <Item309>
       <Item309>
-        <Filename Value="..\..\Crypto\Generators\ClpKdf2BytesGenerator.pas"/>
-        <UnitName Value="ClpKdf2BytesGenerator"/>
+        <Filename Value="..\..\Crypto\Parameters\ClpKdfParameters.pas"/>
+        <UnitName Value="ClpKdfParameters"/>
       </Item309>
       </Item309>
       <Item310>
       <Item310>
-        <Filename Value="..\..\Crypto\Parameters\ClpIso18033KdfParameters.pas"/>
-        <UnitName Value="ClpIso18033KdfParameters"/>
+        <Filename Value="..\..\Interfaces\ClpIIESWithCipherParameters.pas"/>
+        <UnitName Value="ClpIIESWithCipherParameters"/>
       </Item310>
       </Item310>
       <Item311>
       <Item311>
-        <Filename Value="..\..\Crypto\Parameters\ClpKdfParameters.pas"/>
-        <UnitName Value="ClpKdfParameters"/>
+        <Filename Value="..\..\Interfaces\ClpIIESParameters.pas"/>
+        <UnitName Value="ClpIIESParameters"/>
       </Item311>
       </Item311>
       <Item312>
       <Item312>
-        <Filename Value="..\..\Interfaces\ClpIIESWithCipherParameters.pas"/>
-        <UnitName Value="ClpIIESWithCipherParameters"/>
+        <Filename Value="..\..\Interfaces\ClpIPascalCoinECIESKdfBytesGenerator.pas"/>
+        <UnitName Value="ClpIPascalCoinECIESKdfBytesGenerator"/>
       </Item312>
       </Item312>
       <Item313>
       <Item313>
-        <Filename Value="..\..\Interfaces\ClpIIESParameters.pas"/>
-        <UnitName Value="ClpIIESParameters"/>
+        <Filename Value="..\..\Interfaces\ClpIPascalCoinIESEngine.pas"/>
+        <UnitName Value="ClpIPascalCoinIESEngine"/>
       </Item313>
       </Item313>
       <Item314>
       <Item314>
-        <Filename Value="..\..\Interfaces\ClpIPascalCoinECIESKdfBytesGenerator.pas"/>
-        <UnitName Value="ClpIPascalCoinECIESKdfBytesGenerator"/>
+        <Filename Value="..\..\Interfaces\ClpIIESEngine.pas"/>
+        <UnitName Value="ClpIIESEngine"/>
       </Item314>
       </Item314>
       <Item315>
       <Item315>
-        <Filename Value="..\..\Interfaces\ClpIPascalCoinIESEngine.pas"/>
-        <UnitName Value="ClpIPascalCoinIESEngine"/>
+        <Filename Value="..\..\Interfaces\ClpIIESCipher.pas"/>
+        <UnitName Value="ClpIIESCipher"/>
       </Item315>
       </Item315>
       <Item316>
       <Item316>
-        <Filename Value="..\..\Interfaces\ClpIIESEngine.pas"/>
-        <UnitName Value="ClpIIESEngine"/>
+        <Filename Value="..\..\Interfaces\ClpIZeroBytePadding.pas"/>
+        <UnitName Value="ClpIZeroBytePadding"/>
       </Item316>
       </Item316>
       <Item317>
       <Item317>
-        <Filename Value="..\..\Interfaces\ClpIIESCipher.pas"/>
-        <UnitName Value="ClpIIESCipher"/>
+        <Filename Value="..\..\Interfaces\ClpIECIESPublicKeyParser.pas"/>
+        <UnitName Value="ClpIECIESPublicKeyParser"/>
       </Item317>
       </Item317>
       <Item318>
       <Item318>
-        <Filename Value="..\..\Interfaces\ClpIZeroBytePadding.pas"/>
-        <UnitName Value="ClpIZeroBytePadding"/>
+        <Filename Value="..\..\Interfaces\ClpIEphemeralKeyPairGenerator.pas"/>
+        <UnitName Value="ClpIEphemeralKeyPairGenerator"/>
       </Item318>
       </Item318>
       <Item319>
       <Item319>
-        <Filename Value="..\..\Interfaces\ClpIECIESPublicKeyParser.pas"/>
-        <UnitName Value="ClpIECIESPublicKeyParser"/>
+        <Filename Value="..\..\Interfaces\ClpIEphemeralKeyPair.pas"/>
+        <UnitName Value="ClpIEphemeralKeyPair"/>
       </Item319>
       </Item319>
       <Item320>
       <Item320>
-        <Filename Value="..\..\Interfaces\ClpIEphemeralKeyPairGenerator.pas"/>
-        <UnitName Value="ClpIEphemeralKeyPairGenerator"/>
+        <Filename Value="..\..\Interfaces\ClpIKeyParser.pas"/>
+        <UnitName Value="ClpIKeyParser"/>
       </Item320>
       </Item320>
       <Item321>
       <Item321>
-        <Filename Value="..\..\Interfaces\ClpIEphemeralKeyPair.pas"/>
-        <UnitName Value="ClpIEphemeralKeyPair"/>
+        <Filename Value="..\..\Interfaces\ClpIKdf2BytesGenerator.pas"/>
+        <UnitName Value="ClpIKdf2BytesGenerator"/>
       </Item321>
       </Item321>
       <Item322>
       <Item322>
-        <Filename Value="..\..\Interfaces\ClpIKeyParser.pas"/>
-        <UnitName Value="ClpIKeyParser"/>
+        <Filename Value="..\..\Interfaces\ClpIBaseKdfBytesGenerator.pas"/>
+        <UnitName Value="ClpIBaseKdfBytesGenerator"/>
       </Item322>
       </Item322>
       <Item323>
       <Item323>
-        <Filename Value="..\..\Interfaces\ClpIKdf2BytesGenerator.pas"/>
-        <UnitName Value="ClpIKdf2BytesGenerator"/>
+        <Filename Value="..\..\Interfaces\ClpIIso18033KdfParameters.pas"/>
+        <UnitName Value="ClpIIso18033KdfParameters"/>
       </Item323>
       </Item323>
       <Item324>
       <Item324>
-        <Filename Value="..\..\Interfaces\ClpIBaseKdfBytesGenerator.pas"/>
-        <UnitName Value="ClpIBaseKdfBytesGenerator"/>
+        <Filename Value="..\..\Interfaces\ClpIKdfParameters.pas"/>
+        <UnitName Value="ClpIKdfParameters"/>
       </Item324>
       </Item324>
       <Item325>
       <Item325>
-        <Filename Value="..\..\Interfaces\ClpIIso18033KdfParameters.pas"/>
-        <UnitName Value="ClpIIso18033KdfParameters"/>
+        <Filename Value="..\..\Interfaces\ClpIDerivationFunction.pas"/>
+        <UnitName Value="ClpIDerivationFunction"/>
       </Item325>
       </Item325>
       <Item326>
       <Item326>
-        <Filename Value="..\..\Interfaces\ClpIKdfParameters.pas"/>
-        <UnitName Value="ClpIKdfParameters"/>
+        <Filename Value="..\..\Interfaces\ClpIDerivationParameters.pas"/>
+        <UnitName Value="ClpIDerivationParameters"/>
       </Item326>
       </Item326>
       <Item327>
       <Item327>
-        <Filename Value="..\..\Interfaces\ClpIDerivationFunction.pas"/>
-        <UnitName Value="ClpIDerivationFunction"/>
+        <Filename Value="..\..\Interfaces\ClpIECDHBasicAgreement.pas"/>
+        <UnitName Value="ClpIECDHBasicAgreement"/>
       </Item327>
       </Item327>
       <Item328>
       <Item328>
-        <Filename Value="..\..\Interfaces\ClpIDerivationParameters.pas"/>
-        <UnitName Value="ClpIDerivationParameters"/>
+        <Filename Value="..\..\Interfaces\ClpIBasicAgreement.pas"/>
+        <UnitName Value="ClpIBasicAgreement"/>
       </Item328>
       </Item328>
       <Item329>
       <Item329>
-        <Filename Value="..\..\Interfaces\ClpIECDHBasicAgreement.pas"/>
-        <UnitName Value="ClpIECDHBasicAgreement"/>
+        <Filename Value="..\..\Crypto\Modes\ClpSicBlockCipher.pas"/>
+        <UnitName Value="ClpSicBlockCipher"/>
       </Item329>
       </Item329>
       <Item330>
       <Item330>
-        <Filename Value="..\..\Interfaces\ClpIBasicAgreement.pas"/>
-        <UnitName Value="ClpIBasicAgreement"/>
+        <Filename Value="..\..\Crypto\Modes\ClpCfbBlockCipher.pas"/>
+        <UnitName Value="ClpCfbBlockCipher"/>
       </Item330>
       </Item330>
       <Item331>
       <Item331>
-        <Filename Value="..\..\Crypto\Modes\ClpSicBlockCipher.pas"/>
-        <UnitName Value="ClpSicBlockCipher"/>
+        <Filename Value="..\..\Crypto\Generators\ClpCipherKeyGenerator.pas"/>
+        <UnitName Value="ClpCipherKeyGenerator"/>
       </Item331>
       </Item331>
       <Item332>
       <Item332>
-        <Filename Value="..\..\Crypto\Modes\ClpCfbBlockCipher.pas"/>
-        <UnitName Value="ClpCfbBlockCipher"/>
+        <Filename Value="..\..\Utils\ClpStringUtils.pas"/>
+        <UnitName Value="ClpStringUtils"/>
       </Item332>
       </Item332>
       <Item333>
       <Item333>
-        <Filename Value="..\..\Crypto\Generators\ClpCipherKeyGenerator.pas"/>
-        <UnitName Value="ClpCipherKeyGenerator"/>
+        <Filename Value="..\..\Interfaces\ClpICipherKeyGenerator.pas"/>
+        <UnitName Value="ClpICipherKeyGenerator"/>
       </Item333>
       </Item333>
       <Item334>
       <Item334>
-        <Filename Value="..\..\Utils\ClpStringUtils.pas"/>
-        <UnitName Value="ClpStringUtils"/>
+        <Filename Value="..\..\Interfaces\ClpIDigest.pas"/>
+        <UnitName Value="ClpIDigest"/>
       </Item334>
       </Item334>
       <Item335>
       <Item335>
-        <Filename Value="..\..\Interfaces\ClpICipherKeyGenerator.pas"/>
-        <UnitName Value="ClpICipherKeyGenerator"/>
+        <Filename Value="..\..\Interfaces\ClpISicBlockCipher.pas"/>
+        <UnitName Value="ClpISicBlockCipher"/>
       </Item335>
       </Item335>
       <Item336>
       <Item336>
-        <Filename Value="..\..\Interfaces\ClpIDigest.pas"/>
-        <UnitName Value="ClpIDigest"/>
+        <Filename Value="..\..\Interfaces\ClpIStreamCipher.pas"/>
+        <UnitName Value="ClpIStreamCipher"/>
       </Item336>
       </Item336>
       <Item337>
       <Item337>
-        <Filename Value="..\..\Interfaces\ClpISicBlockCipher.pas"/>
-        <UnitName Value="ClpISicBlockCipher"/>
+        <Filename Value="..\..\Crypto\Modes\ClpOfbBlockCipher.pas"/>
+        <UnitName Value="ClpOfbBlockCipher"/>
       </Item337>
       </Item337>
       <Item338>
       <Item338>
-        <Filename Value="..\..\Interfaces\ClpIStreamCipher.pas"/>
-        <UnitName Value="ClpIStreamCipher"/>
+        <Filename Value="..\..\Interfaces\ClpIOfbBlockCipher.pas"/>
+        <UnitName Value="ClpIOfbBlockCipher"/>
       </Item338>
       </Item338>
       <Item339>
       <Item339>
-        <Filename Value="..\..\Crypto\Modes\ClpOfbBlockCipher.pas"/>
-        <UnitName Value="ClpOfbBlockCipher"/>
+        <Filename Value="..\..\Interfaces\ClpICfbBlockCipher.pas"/>
+        <UnitName Value="ClpICfbBlockCipher"/>
       </Item339>
       </Item339>
       <Item340>
       <Item340>
-        <Filename Value="..\..\Interfaces\ClpIOfbBlockCipher.pas"/>
-        <UnitName Value="ClpIOfbBlockCipher"/>
+        <Filename Value="..\..\Crypto\Paddings\ClpX923Padding.pas"/>
+        <UnitName Value="ClpX923Padding"/>
       </Item340>
       </Item340>
       <Item341>
       <Item341>
-        <Filename Value="..\..\Interfaces\ClpICfbBlockCipher.pas"/>
-        <UnitName Value="ClpICfbBlockCipher"/>
+        <Filename Value="..\..\Interfaces\ClpIX923Padding.pas"/>
+        <UnitName Value="ClpIX923Padding"/>
       </Item341>
       </Item341>
       <Item342>
       <Item342>
-        <Filename Value="..\..\Crypto\Paddings\ClpX923Padding.pas"/>
-        <UnitName Value="ClpX923Padding"/>
+        <Filename Value="..\..\Crypto\Paddings\ClpTTBCPadding.pas"/>
+        <UnitName Value="ClpTTBCPadding"/>
       </Item342>
       </Item342>
       <Item343>
       <Item343>
-        <Filename Value="..\..\Interfaces\ClpIX923Padding.pas"/>
-        <UnitName Value="ClpIX923Padding"/>
+        <Filename Value="..\..\Crypto\Paddings\ClpISO7816d4Padding.pas"/>
+        <UnitName Value="ClpISO7816d4Padding"/>
       </Item343>
       </Item343>
       <Item344>
       <Item344>
-        <Filename Value="..\..\Crypto\Paddings\ClpTTBCPadding.pas"/>
-        <UnitName Value="ClpTTBCPadding"/>
+        <Filename Value="..\..\Interfaces\ClpITBCPadding.pas"/>
+        <UnitName Value="ClpITBCPadding"/>
       </Item344>
       </Item344>
       <Item345>
       <Item345>
-        <Filename Value="..\..\Crypto\Paddings\ClpISO7816d4Padding.pas"/>
-        <UnitName Value="ClpISO7816d4Padding"/>
+        <Filename Value="..\..\Interfaces\ClpIISO7816d4Padding.pas"/>
+        <UnitName Value="ClpIISO7816d4Padding"/>
       </Item345>
       </Item345>
       <Item346>
       <Item346>
-        <Filename Value="..\..\Interfaces\ClpITBCPadding.pas"/>
-        <UnitName Value="ClpITBCPadding"/>
+        <Filename Value="..\..\Crypto\Paddings\ClpISO10126d2Padding.pas"/>
+        <UnitName Value="ClpISO10126d2Padding"/>
       </Item346>
       </Item346>
       <Item347>
       <Item347>
-        <Filename Value="..\..\Interfaces\ClpIISO7816d4Padding.pas"/>
-        <UnitName Value="ClpIISO7816d4Padding"/>
+        <Filename Value="..\..\Interfaces\ClpIISO10126d2Padding.pas"/>
+        <UnitName Value="ClpIISO10126d2Padding"/>
       </Item347>
       </Item347>
       <Item348>
       <Item348>
-        <Filename Value="..\..\Crypto\Paddings\ClpISO10126d2Padding.pas"/>
-        <UnitName Value="ClpISO10126d2Padding"/>
+        <Filename Value="CryptoLib4PascalPackage.pas"/>
+        <AddToUsesPkgSection Value="False"/>
+        <UnitName Value="CryptoLib4PascalPackage"/>
       </Item348>
       </Item348>
       <Item349>
       <Item349>
-        <Filename Value="..\..\Interfaces\ClpIISO10126d2Padding.pas"/>
-        <UnitName Value="ClpIISO10126d2Padding"/>
+        <Filename Value="..\..\Crypto\Generators\ClpPkcs5S2ParametersGenerator.pas"/>
+        <UnitName Value="ClpPkcs5S2ParametersGenerator"/>
       </Item349>
       </Item349>
       <Item350>
       <Item350>
-        <Filename Value="CryptoLib4PascalPackage.pas"/>
-        <AddToUsesPkgSection Value="False"/>
-        <UnitName Value="CryptoLib4PascalPackage"/>
+        <Filename Value="..\..\Interfaces\ClpIPkcs5S2ParametersGenerator.pas"/>
+        <UnitName Value="ClpIPkcs5S2ParametersGenerator"/>
       </Item350>
       </Item350>
       <Item351>
       <Item351>
-        <Filename Value="..\..\Crypto\Generators\ClpPkcs5S2ParametersGenerator.pas"/>
-        <UnitName Value="ClpPkcs5S2ParametersGenerator"/>
+        <Filename Value="..\..\Interfaces\ClpIPbeParametersGenerator.pas"/>
+        <UnitName Value="ClpIPbeParametersGenerator"/>
       </Item351>
       </Item351>
       <Item352>
       <Item352>
-        <Filename Value="..\..\Interfaces\ClpIPkcs5S2ParametersGenerator.pas"/>
-        <UnitName Value="ClpIPkcs5S2ParametersGenerator"/>
+        <Filename Value="..\..\Crypto\Generators\ClpPbeParametersGenerator.pas"/>
+        <UnitName Value="ClpPbeParametersGenerator"/>
       </Item352>
       </Item352>
       <Item353>
       <Item353>
-        <Filename Value="..\..\Interfaces\ClpIPbeParametersGenerator.pas"/>
-        <UnitName Value="ClpIPbeParametersGenerator"/>
+        <Filename Value="..\..\Crypto\Macs\ClpHMac.pas"/>
+        <UnitName Value="ClpHMac"/>
       </Item353>
       </Item353>
       <Item354>
       <Item354>
-        <Filename Value="..\..\Crypto\Generators\ClpPbeParametersGenerator.pas"/>
-        <UnitName Value="ClpPbeParametersGenerator"/>
+        <Filename Value="..\..\Asn1\Misc\ClpMiscObjectIdentifiers.pas"/>
+        <UnitName Value="ClpMiscObjectIdentifiers"/>
       </Item354>
       </Item354>
       <Item355>
       <Item355>
-        <Filename Value="..\..\Crypto\Macs\ClpHMac.pas"/>
-        <UnitName Value="ClpHMac"/>
+        <Filename Value="..\..\Asn1\Iana\ClpIanaObjectIdentifiers.pas"/>
+        <UnitName Value="ClpIanaObjectIdentifiers"/>
       </Item355>
       </Item355>
       <Item356>
       <Item356>
-        <Filename Value="..\..\Asn1\Misc\ClpMiscObjectIdentifiers.pas"/>
-        <UnitName Value="ClpMiscObjectIdentifiers"/>
+        <Filename Value="..\..\Security\ClpMacUtilities.pas"/>
+        <UnitName Value="ClpMacUtilities"/>
       </Item356>
       </Item356>
       <Item357>
       <Item357>
-        <Filename Value="..\..\Asn1\Iana\ClpIanaObjectIdentifiers.pas"/>
-        <UnitName Value="ClpIanaObjectIdentifiers"/>
+        <Filename Value="..\..\Interfaces\ClpIMac.pas"/>
+        <UnitName Value="ClpIMac"/>
       </Item357>
       </Item357>
       <Item358>
       <Item358>
-        <Filename Value="..\..\Security\ClpMacUtilities.pas"/>
-        <UnitName Value="ClpMacUtilities"/>
+        <Filename Value="..\..\Interfaces\ClpIHMac.pas"/>
+        <UnitName Value="ClpIHMac"/>
       </Item358>
       </Item358>
       <Item359>
       <Item359>
-        <Filename Value="..\..\Interfaces\ClpIMac.pas"/>
-        <UnitName Value="ClpIMac"/>
+        <Filename Value="..\..\Crypto\Signers\ClpDsaSigner.pas"/>
+        <UnitName Value="ClpDsaSigner"/>
       </Item359>
       </Item359>
       <Item360>
       <Item360>
-        <Filename Value="..\..\Interfaces\ClpIHMac.pas"/>
-        <UnitName Value="ClpIHMac"/>
+        <Filename Value="..\..\Crypto\Generators\ClpDsaKeyPairGenerator.pas"/>
+        <UnitName Value="ClpDsaKeyPairGenerator"/>
       </Item360>
       </Item360>
       <Item361>
       <Item361>
-        <Filename Value="..\..\Interfaces\ClpIECSchnorrLIBSECPSigner.pas"/>
-        <UnitName Value="ClpIECSchnorrLIBSECPSigner"/>
+        <Filename Value="..\..\Crypto\Signers\ClpECNRSigner.pas"/>
+        <UnitName Value="ClpECNRSigner"/>
       </Item361>
       </Item361>
       <Item362>
       <Item362>
-        <Filename Value="..\..\Interfaces\ClpIECSchnorrISOXSigner.pas"/>
-        <UnitName Value="ClpIECSchnorrISOXSigner"/>
+        <Filename Value="..\..\Crypto\Parameters\ClpDsaKeyGenerationParameters.pas"/>
+        <UnitName Value="ClpDsaKeyGenerationParameters"/>
       </Item362>
       </Item362>
       <Item363>
       <Item363>
-        <Filename Value="..\..\Interfaces\ClpIECSchnorrISOSigner.pas"/>
-        <UnitName Value="ClpIECSchnorrISOSigner"/>
+        <Filename Value="..\..\Crypto\Parameters\ClpDsaPrivateKeyParameters.pas"/>
+        <UnitName Value="ClpDsaPrivateKeyParameters"/>
       </Item363>
       </Item363>
       <Item364>
       <Item364>
-        <Filename Value="..\..\Interfaces\ClpIECSchnorrBSISigner.pas"/>
-        <UnitName Value="ClpIECSchnorrBSISigner"/>
+        <Filename Value="..\..\Crypto\Parameters\ClpDsaPublicKeyParameters.pas"/>
+        <UnitName Value="ClpDsaPublicKeyParameters"/>
       </Item364>
       </Item364>
       <Item365>
       <Item365>
-        <Filename Value="..\..\Interfaces\ClpISchnorr.pas"/>
-        <UnitName Value="ClpISchnorr"/>
+        <Filename Value="..\..\Crypto\Parameters\ClpDsaValidationParameters.pas"/>
+        <UnitName Value="ClpDsaValidationParameters"/>
       </Item365>
       </Item365>
       <Item366>
       <Item366>
-        <Filename Value="..\..\Crypto\Signers\ClpECSchnorrLIBSECPSigner.pas"/>
-        <UnitName Value="ClpECSchnorrLIBSECPSigner"/>
+        <Filename Value="..\..\Crypto\Parameters\ClpDsaParameters.pas"/>
+        <UnitName Value="ClpDsaParameters"/>
       </Item366>
       </Item366>
       <Item367>
       <Item367>
-        <Filename Value="..\..\Crypto\Signers\ClpECSchnorrISOXSigner.pas"/>
-        <UnitName Value="ClpECSchnorrISOXSigner"/>
+        <Filename Value="..\..\Crypto\Parameters\ClpDsaKeyParameters.pas"/>
+        <UnitName Value="ClpDsaKeyParameters"/>
       </Item367>
       </Item367>
       <Item368>
       <Item368>
-        <Filename Value="..\..\Crypto\Signers\ClpECSchnorrISOSigner.pas"/>
-        <UnitName Value="ClpECSchnorrISOSigner"/>
+        <Filename Value="..\..\Interfaces\ClpIECNRSigner.pas"/>
+        <UnitName Value="ClpIECNRSigner"/>
       </Item368>
       </Item368>
       <Item369>
       <Item369>
-        <Filename Value="..\..\Crypto\Signers\ClpECSchnorrBSISigner.pas"/>
-        <UnitName Value="ClpECSchnorrBSISigner"/>
+        <Filename Value="..\..\Interfaces\ClpIDsaSigner.pas"/>
+        <UnitName Value="ClpIDsaSigner"/>
       </Item369>
       </Item369>
       <Item370>
       <Item370>
-        <Filename Value="..\..\Crypto\Signers\ClpDsaSigner.pas"/>
-        <UnitName Value="ClpDsaSigner"/>
+        <Filename Value="..\..\Interfaces\ClpIDsaKeyPairGenerator.pas"/>
+        <UnitName Value="ClpIDsaKeyPairGenerator"/>
       </Item370>
       </Item370>
       <Item371>
       <Item371>
-        <Filename Value="..\..\Crypto\Generators\ClpDsaKeyPairGenerator.pas"/>
-        <UnitName Value="ClpDsaKeyPairGenerator"/>
+        <Filename Value="..\..\Interfaces\ClpIDsaPrivateKeyParameters.pas"/>
+        <UnitName Value="ClpIDsaPrivateKeyParameters"/>
       </Item371>
       </Item371>
       <Item372>
       <Item372>
-        <Filename Value="..\..\Crypto\Signers\ClpECNRSigner.pas"/>
-        <UnitName Value="ClpECNRSigner"/>
+        <Filename Value="..\..\Interfaces\ClpIDsaKeyGenerationParameters.pas"/>
+        <UnitName Value="ClpIDsaKeyGenerationParameters"/>
       </Item372>
       </Item372>
       <Item373>
       <Item373>
-        <Filename Value="..\..\Crypto\Parameters\ClpDsaKeyGenerationParameters.pas"/>
-        <UnitName Value="ClpDsaKeyGenerationParameters"/>
+        <Filename Value="..\..\Interfaces\ClpIDsaKeyParameters.pas"/>
+        <UnitName Value="ClpIDsaKeyParameters"/>
       </Item373>
       </Item373>
       <Item374>
       <Item374>
-        <Filename Value="..\..\Crypto\Parameters\ClpDsaPrivateKeyParameters.pas"/>
-        <UnitName Value="ClpDsaPrivateKeyParameters"/>
+        <Filename Value="..\..\Interfaces\ClpIDsaPublicKeyParameters.pas"/>
+        <UnitName Value="ClpIDsaPublicKeyParameters"/>
       </Item374>
       </Item374>
       <Item375>
       <Item375>
-        <Filename Value="..\..\Crypto\Parameters\ClpDsaPublicKeyParameters.pas"/>
-        <UnitName Value="ClpDsaPublicKeyParameters"/>
+        <Filename Value="..\..\Interfaces\ClpIDsaParameters.pas"/>
+        <UnitName Value="ClpIDsaParameters"/>
       </Item375>
       </Item375>
       <Item376>
       <Item376>
-        <Filename Value="..\..\Crypto\Parameters\ClpDsaValidationParameters.pas"/>
-        <UnitName Value="ClpDsaValidationParameters"/>
+        <Filename Value="..\..\Interfaces\ClpIDsaValidationParameters.pas"/>
+        <UnitName Value="ClpIDsaValidationParameters"/>
       </Item376>
       </Item376>
       <Item377>
       <Item377>
-        <Filename Value="..\..\Crypto\Parameters\ClpDsaParameters.pas"/>
-        <UnitName Value="ClpDsaParameters"/>
+        <Filename Value="..\..\Utils\Encoders\ClpBase58.pas"/>
+        <UnitName Value="ClpBase58"/>
       </Item377>
       </Item377>
       <Item378>
       <Item378>
-        <Filename Value="..\..\Crypto\Parameters\ClpDsaKeyParameters.pas"/>
-        <UnitName Value="ClpDsaKeyParameters"/>
+        <Filename Value="..\..\Crypto\Digests\ClpDigest.pas"/>
+        <UnitName Value="ClpDigest"/>
       </Item378>
       </Item378>
       <Item379>
       <Item379>
-        <Filename Value="..\..\Interfaces\ClpIECNRSigner.pas"/>
-        <UnitName Value="ClpIECNRSigner"/>
+        <Filename Value="..\..\Crypto\Agreement\ClpECDHCBasicAgreement.pas"/>
+        <UnitName Value="ClpECDHCBasicAgreement"/>
       </Item379>
       </Item379>
       <Item380>
       <Item380>
-        <Filename Value="..\..\Interfaces\ClpIDsaSigner.pas"/>
-        <UnitName Value="ClpIDsaSigner"/>
+        <Filename Value="..\..\Interfaces\ClpIECDHCBasicAgreement.pas"/>
+        <UnitName Value="ClpIECDHCBasicAgreement"/>
       </Item380>
       </Item380>
       <Item381>
       <Item381>
-        <Filename Value="..\..\Interfaces\ClpIDsaKeyPairGenerator.pas"/>
-        <UnitName Value="ClpIDsaKeyPairGenerator"/>
+        <Filename Value="..\..\Crypto\Signers\ClpHMacDsaKCalculator.pas"/>
+        <UnitName Value="ClpHMacDsaKCalculator"/>
       </Item381>
       </Item381>
       <Item382>
       <Item382>
-        <Filename Value="..\..\Interfaces\ClpIDsaPrivateKeyParameters.pas"/>
-        <UnitName Value="ClpIDsaPrivateKeyParameters"/>
+        <Filename Value="..\..\Interfaces\ClpIHMacDsaKCalculator.pas"/>
+        <UnitName Value="ClpIHMacDsaKCalculator"/>
       </Item382>
       </Item382>
       <Item383>
       <Item383>
-        <Filename Value="..\..\Interfaces\ClpIDsaKeyGenerationParameters.pas"/>
-        <UnitName Value="ClpIDsaKeyGenerationParameters"/>
+        <Filename Value="..\..\Crypto\Generators\ClpHkdfBytesGenerator.pas"/>
+        <UnitName Value="ClpHkdfBytesGenerator"/>
       </Item383>
       </Item383>
       <Item384>
       <Item384>
-        <Filename Value="..\..\Interfaces\ClpIDsaKeyParameters.pas"/>
-        <UnitName Value="ClpIDsaKeyParameters"/>
+        <Filename Value="..\..\Interfaces\ClpIHkdfBytesGenerator.pas"/>
+        <UnitName Value="ClpIHkdfBytesGenerator"/>
       </Item384>
       </Item384>
       <Item385>
       <Item385>
-        <Filename Value="..\..\Interfaces\ClpIDsaPublicKeyParameters.pas"/>
-        <UnitName Value="ClpIDsaPublicKeyParameters"/>
+        <Filename Value="..\..\Crypto\Parameters\ClpHkdfParameters.pas"/>
+        <UnitName Value="ClpHkdfParameters"/>
       </Item385>
       </Item385>
       <Item386>
       <Item386>
-        <Filename Value="..\..\Interfaces\ClpIDsaParameters.pas"/>
-        <UnitName Value="ClpIDsaParameters"/>
+        <Filename Value="..\..\Interfaces\ClpIHkdfParameters.pas"/>
+        <UnitName Value="ClpIHkdfParameters"/>
       </Item386>
       </Item386>
       <Item387>
       <Item387>
-        <Filename Value="..\..\Interfaces\ClpIDsaValidationParameters.pas"/>
-        <UnitName Value="ClpIDsaValidationParameters"/>
+        <Filename Value="..\..\Crypto\Parameters\ClpDsaParameterGenerationParameters.pas"/>
+        <UnitName Value="ClpDsaParameterGenerationParameters"/>
       </Item387>
       </Item387>
       <Item388>
       <Item388>
-        <Filename Value="..\..\Utils\Encoders\ClpBase58.pas"/>
-        <UnitName Value="ClpBase58"/>
+        <Filename Value="..\..\Interfaces\ClpIDsaParameterGenerationParameters.pas"/>
+        <UnitName Value="ClpIDsaParameterGenerationParameters"/>
       </Item388>
       </Item388>
       <Item389>
       <Item389>
-        <Filename Value="..\..\Crypto\Digests\ClpDigest.pas"/>
-        <UnitName Value="ClpDigest"/>
+        <Filename Value="..\..\Math\EC\ClpValidityPrecompInfo.pas"/>
+        <UnitName Value="ClpValidityPrecompInfo"/>
       </Item389>
       </Item389>
       <Item390>
       <Item390>
-        <Filename Value="..\..\Crypto\Agreement\ClpECDHCBasicAgreement.pas"/>
-        <UnitName Value="ClpECDHCBasicAgreement"/>
+        <Filename Value="..\..\Interfaces\ClpIValidityPrecompInfo.pas"/>
+        <UnitName Value="ClpIValidityPrecompInfo"/>
       </Item390>
       </Item390>
       <Item391>
       <Item391>
-        <Filename Value="..\..\Interfaces\ClpIECDHCBasicAgreement.pas"/>
-        <UnitName Value="ClpIECDHCBasicAgreement"/>
+        <Filename Value="..\..\Crypto\Generators\ClpDsaParametersGenerator.pas"/>
+        <UnitName Value="ClpDsaParametersGenerator"/>
       </Item391>
       </Item391>
       <Item392>
       <Item392>
-        <Filename Value="..\..\Crypto\Signers\ClpHMacDsaKCalculator.pas"/>
-        <UnitName Value="ClpHMacDsaKCalculator"/>
+        <Filename Value="..\..\Asn1\X509\ClpDsaParameter.pas"/>
+        <UnitName Value="ClpDsaParameter"/>
       </Item392>
       </Item392>
       <Item393>
       <Item393>
-        <Filename Value="..\..\Interfaces\ClpIHMacDsaKCalculator.pas"/>
-        <UnitName Value="ClpIHMacDsaKCalculator"/>
+        <Filename Value="..\..\Interfaces\ClpIDsaParameter.pas"/>
+        <UnitName Value="ClpIDsaParameter"/>
       </Item393>
       </Item393>
       <Item394>
       <Item394>
-        <Filename Value="..\..\Crypto\Generators\ClpHkdfBytesGenerator.pas"/>
-        <UnitName Value="ClpHkdfBytesGenerator"/>
+        <Filename Value="..\..\Interfaces\ClpIKeyEncoder.pas"/>
+        <UnitName Value="ClpIKeyEncoder"/>
       </Item394>
       </Item394>
       <Item395>
       <Item395>
-        <Filename Value="..\..\Interfaces\ClpIHkdfBytesGenerator.pas"/>
-        <UnitName Value="ClpIHkdfBytesGenerator"/>
+        <Filename Value="..\..\Interfaces\ClpIDsaParametersGenerator.pas"/>
+        <UnitName Value="ClpIDsaParametersGenerator"/>
       </Item395>
       </Item395>
       <Item396>
       <Item396>
-        <Filename Value="..\..\Crypto\Parameters\ClpHkdfParameters.pas"/>
-        <UnitName Value="ClpHkdfParameters"/>
+        <Filename Value="..\..\Interfaces\ClpIPreCompCallBack.pas"/>
+        <UnitName Value="ClpIPreCompCallBack"/>
       </Item396>
       </Item396>
       <Item397>
       <Item397>
-        <Filename Value="..\..\Interfaces\ClpIHkdfParameters.pas"/>
-        <UnitName Value="ClpIHkdfParameters"/>
+        <Filename Value="..\..\Math\EC\Multiplier\ClpValidityPrecompInfo.pas"/>
+        <AddToUsesPkgSection Value="False"/>
+        <UnitName Value="ClpValidityPrecompInfo"/>
       </Item397>
       </Item397>
       <Item398>
       <Item398>
-        <Filename Value="..\..\Crypto\Parameters\ClpDsaParameterGenerationParameters.pas"/>
-        <UnitName Value="ClpDsaParameterGenerationParameters"/>
+        <Filename Value="..\..\Asn1\Nist\ClpNistNamedCurves.pas"/>
+        <UnitName Value="ClpNistNamedCurves"/>
       </Item398>
       </Item398>
       <Item399>
       <Item399>
-        <Filename Value="..\..\Interfaces\ClpIDsaParameterGenerationParameters.pas"/>
-        <UnitName Value="ClpIDsaParameterGenerationParameters"/>
+        <Filename Value="..\..\Math\Raw\ClpNat256.pas"/>
+        <UnitName Value="ClpNat256"/>
       </Item399>
       </Item399>
       <Item400>
       <Item400>
-        <Filename Value="..\..\Math\EC\ClpValidityPrecompInfo.pas"/>
-        <UnitName Value="ClpValidityPrecompInfo"/>
+        <Filename Value="..\..\Math\Raw\ClpNat320.pas"/>
+        <UnitName Value="ClpNat320"/>
       </Item400>
       </Item400>
       <Item401>
       <Item401>
-        <Filename Value="..\..\Interfaces\ClpIValidityPrecompInfo.pas"/>
-        <UnitName Value="ClpIValidityPrecompInfo"/>
+        <Filename Value="..\..\Crypto\Engines\ClpAesLightEngine.pas"/>
+        <UnitName Value="ClpAesLightEngine"/>
       </Item401>
       </Item401>
       <Item402>
       <Item402>
-        <Filename Value="..\..\Crypto\Generators\ClpDsaParametersGenerator.pas"/>
-        <UnitName Value="ClpDsaParametersGenerator"/>
+        <Filename Value="..\..\Interfaces\ClpIAesLightEngine.pas"/>
+        <UnitName Value="ClpIAesLightEngine"/>
       </Item402>
       </Item402>
       <Item403>
       <Item403>
-        <Filename Value="..\..\Asn1\X509\ClpDsaParameter.pas"/>
-        <UnitName Value="ClpDsaParameter"/>
+        <Filename Value="..\..\Crypto\EC\ClpCustomNamedCurves.pas"/>
+        <UnitName Value="ClpCustomNamedCurves"/>
       </Item403>
       </Item403>
       <Item404>
       <Item404>
-        <Filename Value="..\..\Interfaces\ClpIDsaParameter.pas"/>
-        <UnitName Value="ClpIDsaParameter"/>
+        <Filename Value="..\..\Math\EC\Custom\Sec\ClpSecP256K1Field.pas"/>
+        <UnitName Value="ClpSecP256K1Field"/>
       </Item404>
       </Item404>
       <Item405>
       <Item405>
-        <Filename Value="..\..\Interfaces\ClpIKeyEncoder.pas"/>
-        <UnitName Value="ClpIKeyEncoder"/>
+        <Filename Value="..\..\Math\EC\Custom\Sec\ClpSecP256K1FieldElement.pas"/>
+        <UnitName Value="ClpSecP256K1FieldElement"/>
       </Item405>
       </Item405>
       <Item406>
       <Item406>
-        <Filename Value="..\..\Interfaces\ClpIDsaParametersGenerator.pas"/>
-        <UnitName Value="ClpIDsaParametersGenerator"/>
+        <Filename Value="..\..\Interfaces\ClpISecP256K1FieldElement.pas"/>
+        <UnitName Value="ClpISecP256K1FieldElement"/>
       </Item406>
       </Item406>
       <Item407>
       <Item407>
-        <Filename Value="..\..\Interfaces\ClpIPreCompCallBack.pas"/>
-        <UnitName Value="ClpIPreCompCallBack"/>
+        <Filename Value="..\..\Math\EC\Custom\Sec\ClpSecP256K1Point.pas"/>
+        <UnitName Value="ClpSecP256K1Point"/>
       </Item407>
       </Item407>
       <Item408>
       <Item408>
-        <Filename Value="..\..\Math\EC\Multiplier\ClpValidityPrecompInfo.pas"/>
-        <AddToUsesPkgSection Value="False"/>
-        <UnitName Value="ClpValidityPrecompInfo"/>
+        <Filename Value="..\..\Interfaces\ClpISecP256K1Point.pas"/>
+        <UnitName Value="ClpISecP256K1Point"/>
       </Item408>
       </Item408>
       <Item409>
       <Item409>
-        <Filename Value="..\..\Asn1\Nist\ClpNistNamedCurves.pas"/>
-        <UnitName Value="ClpNistNamedCurves"/>
+        <Filename Value="..\..\Math\EC\Custom\Sec\ClpSecP256K1Curve.pas"/>
+        <UnitName Value="ClpSecP256K1Curve"/>
       </Item409>
       </Item409>
       <Item410>
       <Item410>
-        <Filename Value="..\..\Math\Raw\ClpNat256.pas"/>
-        <UnitName Value="ClpNat256"/>
+        <Filename Value="..\..\Interfaces\ClpISecP256K1Curve.pas"/>
+        <UnitName Value="ClpISecP256K1Curve"/>
       </Item410>
       </Item410>
       <Item411>
       <Item411>
-        <Filename Value="..\..\Math\Raw\ClpNat320.pas"/>
-        <UnitName Value="ClpNat320"/>
+        <Filename Value="..\..\Math\EC\Custom\Sec\ClpSecP384R1Field.pas"/>
+        <UnitName Value="ClpSecP384R1Field"/>
       </Item411>
       </Item411>
       <Item412>
       <Item412>
-        <Filename Value="..\..\Crypto\Engines\ClpAesLightEngine.pas"/>
-        <UnitName Value="ClpAesLightEngine"/>
+        <Filename Value="..\..\Math\Raw\ClpNat384.pas"/>
+        <UnitName Value="ClpNat384"/>
       </Item412>
       </Item412>
       <Item413>
       <Item413>
-        <Filename Value="..\..\Interfaces\ClpIAesLightEngine.pas"/>
-        <UnitName Value="ClpIAesLightEngine"/>
+        <Filename Value="..\..\Math\EC\Custom\Sec\ClpSecP384R1FieldElement.pas"/>
+        <UnitName Value="ClpSecP384R1FieldElement"/>
       </Item413>
       </Item413>
       <Item414>
       <Item414>
-        <Filename Value="..\..\Crypto\EC\ClpCustomNamedCurves.pas"/>
-        <UnitName Value="ClpCustomNamedCurves"/>
+        <Filename Value="..\..\Interfaces\ClpISecP384R1FieldElement.pas"/>
+        <UnitName Value="ClpISecP384R1FieldElement"/>
       </Item414>
       </Item414>
       <Item415>
       <Item415>
-        <Filename Value="..\..\Math\EC\Custom\Sec\ClpSecP256K1Field.pas"/>
-        <UnitName Value="ClpSecP256K1Field"/>
+        <Filename Value="..\..\Math\EC\Custom\Sec\ClpSecP384R1Point.pas"/>
+        <UnitName Value="ClpSecP384R1Point"/>
       </Item415>
       </Item415>
       <Item416>
       <Item416>
-        <Filename Value="..\..\Math\EC\Custom\Sec\ClpSecP256K1FieldElement.pas"/>
-        <UnitName Value="ClpSecP256K1FieldElement"/>
+        <Filename Value="..\..\Interfaces\ClpISecP384R1Point.pas"/>
+        <UnitName Value="ClpISecP384R1Point"/>
       </Item416>
       </Item416>
       <Item417>
       <Item417>
-        <Filename Value="..\..\Interfaces\ClpISecP256K1FieldElement.pas"/>
-        <UnitName Value="ClpISecP256K1FieldElement"/>
+        <Filename Value="..\..\Math\EC\Custom\Sec\ClpSecP384R1Curve.pas"/>
+        <UnitName Value="ClpSecP384R1Curve"/>
       </Item417>
       </Item417>
       <Item418>
       <Item418>
-        <Filename Value="..\..\Math\EC\Custom\Sec\ClpSecP256K1Point.pas"/>
-        <UnitName Value="ClpSecP256K1Point"/>
+        <Filename Value="..\..\Math\Raw\ClpNat192.pas"/>
+        <UnitName Value="ClpNat192"/>
       </Item418>
       </Item418>
       <Item419>
       <Item419>
-        <Filename Value="..\..\Interfaces\ClpISecP256K1Point.pas"/>
-        <UnitName Value="ClpISecP256K1Point"/>
+        <Filename Value="..\..\Interfaces\ClpISecP384R1Curve.pas"/>
+        <UnitName Value="ClpISecP384R1Curve"/>
       </Item419>
       </Item419>
       <Item420>
       <Item420>
-        <Filename Value="..\..\Math\EC\Custom\Sec\ClpSecP256K1Curve.pas"/>
-        <UnitName Value="ClpSecP256K1Curve"/>
+        <Filename Value="..\..\Math\EC\Custom\Sec\ClpSecP521R1Field.pas"/>
+        <UnitName Value="ClpSecP521R1Field"/>
       </Item420>
       </Item420>
       <Item421>
       <Item421>
-        <Filename Value="..\..\Interfaces\ClpISecP256K1Curve.pas"/>
-        <UnitName Value="ClpISecP256K1Curve"/>
+        <Filename Value="..\..\Math\Raw\ClpNat512.pas"/>
+        <UnitName Value="ClpNat512"/>
       </Item421>
       </Item421>
       <Item422>
       <Item422>
-        <Filename Value="..\..\Math\EC\Custom\Sec\ClpSecP384R1Field.pas"/>
-        <UnitName Value="ClpSecP384R1Field"/>
+        <Filename Value="..\..\Math\EC\Custom\Sec\ClpSecP521R1FieldElement.pas"/>
+        <UnitName Value="ClpSecP521R1FieldElement"/>
       </Item422>
       </Item422>
       <Item423>
       <Item423>
-        <Filename Value="..\..\Math\Raw\ClpNat384.pas"/>
-        <UnitName Value="ClpNat384"/>
+        <Filename Value="..\..\Interfaces\ClpISecP521R1FieldElement.pas"/>
+        <UnitName Value="ClpISecP521R1FieldElement"/>
       </Item423>
       </Item423>
       <Item424>
       <Item424>
-        <Filename Value="..\..\Math\EC\Custom\Sec\ClpSecP384R1FieldElement.pas"/>
-        <UnitName Value="ClpSecP384R1FieldElement"/>
+        <Filename Value="..\..\Math\EC\Custom\Sec\ClpSecP521R1Point.pas"/>
+        <UnitName Value="ClpSecP521R1Point"/>
       </Item424>
       </Item424>
       <Item425>
       <Item425>
-        <Filename Value="..\..\Interfaces\ClpISecP384R1FieldElement.pas"/>
-        <UnitName Value="ClpISecP384R1FieldElement"/>
+        <Filename Value="..\..\Interfaces\ClpISecP521R1Point.pas"/>
+        <UnitName Value="ClpISecP521R1Point"/>
       </Item425>
       </Item425>
       <Item426>
       <Item426>
-        <Filename Value="..\..\Math\EC\Custom\Sec\ClpSecP384R1Point.pas"/>
-        <UnitName Value="ClpSecP384R1Point"/>
+        <Filename Value="..\..\Math\EC\Custom\Sec\ClpSecP521R1Curve.pas"/>
+        <UnitName Value="ClpSecP521R1Curve"/>
       </Item426>
       </Item426>
       <Item427>
       <Item427>
-        <Filename Value="..\..\Interfaces\ClpISecP384R1Point.pas"/>
-        <UnitName Value="ClpISecP384R1Point"/>
+        <Filename Value="..\..\Interfaces\ClpISecP521R1Curve.pas"/>
+        <UnitName Value="ClpISecP521R1Curve"/>
       </Item427>
       </Item427>
       <Item428>
       <Item428>
-        <Filename Value="..\..\Math\EC\Custom\Sec\ClpSecP384R1Curve.pas"/>
-        <UnitName Value="ClpSecP384R1Curve"/>
+        <Filename Value="..\..\Math\Raw\ClpInterleave.pas"/>
+        <UnitName Value="ClpInterleave"/>
       </Item428>
       </Item428>
       <Item429>
       <Item429>
-        <Filename Value="..\..\Math\Raw\ClpNat192.pas"/>
-        <UnitName Value="ClpNat192"/>
+        <Filename Value="..\..\Math\EC\Custom\Sec\ClpSecT283Field.pas"/>
+        <UnitName Value="ClpSecT283Field"/>
       </Item429>
       </Item429>
       <Item430>
       <Item430>
-        <Filename Value="..\..\Interfaces\ClpISecP384R1Curve.pas"/>
-        <UnitName Value="ClpISecP384R1Curve"/>
+        <Filename Value="..\..\Math\EC\Custom\Sec\ClpSecT283FieldElement.pas"/>
+        <UnitName Value="ClpSecT283FieldElement"/>
       </Item430>
       </Item430>
       <Item431>
       <Item431>
-        <Filename Value="..\..\Math\EC\Custom\Sec\ClpSecP521R1Field.pas"/>
-        <UnitName Value="ClpSecP521R1Field"/>
+        <Filename Value="..\..\Interfaces\ClpISecT283FieldElement.pas"/>
+        <UnitName Value="ClpISecT283FieldElement"/>
       </Item431>
       </Item431>
       <Item432>
       <Item432>
-        <Filename Value="..\..\Math\Raw\ClpNat512.pas"/>
-        <UnitName Value="ClpNat512"/>
+        <Filename Value="..\..\Math\EC\Custom\Sec\ClpSecT283K1Point.pas"/>
+        <UnitName Value="ClpSecT283K1Point"/>
       </Item432>
       </Item432>
       <Item433>
       <Item433>
-        <Filename Value="..\..\Math\EC\Custom\Sec\ClpSecP521R1FieldElement.pas"/>
-        <UnitName Value="ClpSecP521R1FieldElement"/>
+        <Filename Value="..\..\Interfaces\ClpISecT283K1Point.pas"/>
+        <UnitName Value="ClpISecT283K1Point"/>
       </Item433>
       </Item433>
       <Item434>
       <Item434>
-        <Filename Value="..\..\Interfaces\ClpISecP521R1FieldElement.pas"/>
-        <UnitName Value="ClpISecP521R1FieldElement"/>
+        <Filename Value="..\..\Interfaces\ClpISecT283K1Curve.pas"/>
+        <UnitName Value="ClpISecT283K1Curve"/>
       </Item434>
       </Item434>
       <Item435>
       <Item435>
-        <Filename Value="..\..\Math\EC\Custom\Sec\ClpSecP521R1Point.pas"/>
-        <UnitName Value="ClpSecP521R1Point"/>
+        <Filename Value="..\..\Math\EC\Custom\Sec\ClpSecT283K1Curve.pas"/>
+        <UnitName Value="ClpSecT283K1Curve"/>
       </Item435>
       </Item435>
       <Item436>
       <Item436>
-        <Filename Value="..\..\Interfaces\ClpISecP521R1Point.pas"/>
-        <UnitName Value="ClpISecP521R1Point"/>
+        <Filename Value="..\..\Math\EC\Custom\Sec\ClpSecP256R1Field.pas"/>
+        <UnitName Value="ClpSecP256R1Field"/>
       </Item436>
       </Item436>
       <Item437>
       <Item437>
-        <Filename Value="..\..\Math\EC\Custom\Sec\ClpSecP521R1Curve.pas"/>
-        <UnitName Value="ClpSecP521R1Curve"/>
+        <Filename Value="..\..\Interfaces\ClpISecP256R1FieldElement.pas"/>
+        <UnitName Value="ClpISecP256R1FieldElement"/>
       </Item437>
       </Item437>
       <Item438>
       <Item438>
-        <Filename Value="..\..\Interfaces\ClpISecP521R1Curve.pas"/>
-        <UnitName Value="ClpISecP521R1Curve"/>
+        <Filename Value="..\..\Math\EC\Custom\Sec\ClpSecP256R1FieldElement.pas"/>
+        <UnitName Value="ClpSecP256R1FieldElement"/>
       </Item438>
       </Item438>
       <Item439>
       <Item439>
-        <Filename Value="..\..\Math\Raw\ClpInterleave.pas"/>
-        <UnitName Value="ClpInterleave"/>
+        <Filename Value="..\..\Interfaces\ClpISecP256R1Point.pas"/>
+        <UnitName Value="ClpISecP256R1Point"/>
       </Item439>
       </Item439>
       <Item440>
       <Item440>
-        <Filename Value="..\..\Math\EC\Custom\Sec\ClpSecT283Field.pas"/>
-        <UnitName Value="ClpSecT283Field"/>
+        <Filename Value="..\..\Math\EC\Custom\Sec\ClpSecP256R1Point.pas"/>
+        <UnitName Value="ClpSecP256R1Point"/>
       </Item440>
       </Item440>
       <Item441>
       <Item441>
-        <Filename Value="..\..\Math\EC\Custom\Sec\ClpSecT283FieldElement.pas"/>
-        <UnitName Value="ClpSecT283FieldElement"/>
+        <Filename Value="..\..\Interfaces\ClpISecP256R1Curve.pas"/>
+        <UnitName Value="ClpISecP256R1Curve"/>
       </Item441>
       </Item441>
       <Item442>
       <Item442>
-        <Filename Value="..\..\Interfaces\ClpISecT283FieldElement.pas"/>
-        <UnitName Value="ClpISecT283FieldElement"/>
+        <Filename Value="..\..\Math\EC\Custom\Sec\ClpSecP256R1Curve.pas"/>
+        <UnitName Value="ClpSecP256R1Curve"/>
       </Item442>
       </Item442>
       <Item443>
       <Item443>
-        <Filename Value="..\..\Math\EC\Custom\Sec\ClpSecT283K1Point.pas"/>
-        <UnitName Value="ClpSecT283K1Point"/>
+        <Filename Value="..\..\Asn1\Bsi\ClpBsiObjectIdentifiers.pas"/>
+        <UnitName Value="ClpBsiObjectIdentifiers"/>
       </Item443>
       </Item443>
       <Item444>
       <Item444>
-        <Filename Value="..\..\Interfaces\ClpISecT283K1Point.pas"/>
-        <UnitName Value="ClpISecT283K1Point"/>
+        <Filename Value="..\..\Asn1\Eac\ClpEacObjectIdentifiers.pas"/>
+        <UnitName Value="ClpEacObjectIdentifiers"/>
       </Item444>
       </Item444>
       <Item445>
       <Item445>
-        <Filename Value="..\..\Interfaces\ClpISecT283K1Curve.pas"/>
-        <UnitName Value="ClpISecT283K1Curve"/>
+        <Filename Value="..\..\Crypto\Signers\ClpPlainDsaEncoding.pas"/>
+        <UnitName Value="ClpPlainDsaEncoding"/>
       </Item445>
       </Item445>
       <Item446>
       <Item446>
-        <Filename Value="..\..\Math\EC\Custom\Sec\ClpSecT283K1Curve.pas"/>
-        <UnitName Value="ClpSecT283K1Curve"/>
+        <Filename Value="..\..\Crypto\Signers\ClpStandardDsaEncoding.pas"/>
+        <UnitName Value="ClpStandardDsaEncoding"/>
       </Item446>
       </Item446>
       <Item447>
       <Item447>
-        <Filename Value="..\..\Math\EC\Custom\Sec\ClpSecP256R1Field.pas"/>
-        <UnitName Value="ClpSecP256R1Field"/>
+        <Filename Value="..\..\Interfaces\ClpIStandardDsaEncoding.pas"/>
+        <UnitName Value="ClpIStandardDsaEncoding"/>
       </Item447>
       </Item447>
       <Item448>
       <Item448>
-        <Filename Value="..\..\Interfaces\ClpISecP256R1FieldElement.pas"/>
-        <UnitName Value="ClpISecP256R1FieldElement"/>
+        <Filename Value="..\..\Interfaces\ClpIPlainDsaEncoding.pas"/>
+        <UnitName Value="ClpIPlainDsaEncoding"/>
       </Item448>
       </Item448>
       <Item449>
       <Item449>
-        <Filename Value="..\..\Math\EC\Custom\Sec\ClpSecP256R1FieldElement.pas"/>
-        <UnitName Value="ClpSecP256R1FieldElement"/>
+        <Filename Value="..\..\Interfaces\ClpIDsaExt.pas"/>
+        <UnitName Value="ClpIDsaExt"/>
       </Item449>
       </Item449>
       <Item450>
       <Item450>
-        <Filename Value="..\..\Interfaces\ClpISecP256R1Point.pas"/>
-        <UnitName Value="ClpISecP256R1Point"/>
+        <Filename Value="..\..\Interfaces\ClpIDsaEncoding.pas"/>
+        <UnitName Value="ClpIDsaEncoding"/>
       </Item450>
       </Item450>
       <Item451>
       <Item451>
-        <Filename Value="..\..\Math\EC\Custom\Sec\ClpSecP256R1Point.pas"/>
-        <UnitName Value="ClpSecP256R1Point"/>
+        <Filename Value="..\..\Interfaces\ClpISchnorrDigestSigner.pas"/>
+        <UnitName Value="ClpISchnorrDigestSigner"/>
       </Item451>
       </Item451>
       <Item452>
       <Item452>
-        <Filename Value="..\..\Interfaces\ClpISecP256R1Curve.pas"/>
-        <UnitName Value="ClpISecP256R1Curve"/>
+        <Filename Value="..\..\Interfaces\ClpIECSchnorrSipaSigner.pas"/>
+        <UnitName Value="ClpIECSchnorrSipaSigner"/>
       </Item452>
       </Item452>
       <Item453>
       <Item453>
-        <Filename Value="..\..\Math\EC\Custom\Sec\ClpSecP256R1Curve.pas"/>
-        <UnitName Value="ClpSecP256R1Curve"/>
+        <Filename Value="..\..\Crypto\Signers\ClpECSchnorrSipaSigner.pas"/>
+        <UnitName Value="ClpECSchnorrSipaSigner"/>
       </Item453>
       </Item453>
       <Item454>
       <Item454>
-        <Filename Value="..\..\Asn1\Bsi\ClpBsiObjectIdentifiers.pas"/>
-        <UnitName Value="ClpBsiObjectIdentifiers"/>
+        <Filename Value="..\..\Crypto\Signers\ClpSchnorrDigestSigner.pas"/>
+        <UnitName Value="ClpSchnorrDigestSigner"/>
       </Item454>
       </Item454>
       <Item455>
       <Item455>
-        <Filename Value="..\..\Asn1\Eac\ClpEacObjectIdentifiers.pas"/>
-        <UnitName Value="ClpEacObjectIdentifiers"/>
+        <Filename Value="..\..\Crypto\Signers\ClpPlainSchnorrEncoding.pas"/>
+        <UnitName Value="ClpPlainSchnorrEncoding"/>
       </Item455>
       </Item455>
       <Item456>
       <Item456>
-        <Filename Value="..\..\Crypto\Signers\ClpPlainDsaEncoding.pas"/>
-        <UnitName Value="ClpPlainDsaEncoding"/>
+        <Filename Value="..\..\Interfaces\ClpIPlainSchnorrEncoding.pas"/>
+        <UnitName Value="ClpIPlainSchnorrEncoding"/>
       </Item456>
       </Item456>
       <Item457>
       <Item457>
-        <Filename Value="..\..\Crypto\Signers\ClpStandardDsaEncoding.pas"/>
-        <UnitName Value="ClpStandardDsaEncoding"/>
+        <Filename Value="..\..\Interfaces\ClpISchnorrEncoding.pas"/>
+        <UnitName Value="ClpISchnorrEncoding"/>
       </Item457>
       </Item457>
       <Item458>
       <Item458>
-        <Filename Value="..\..\Interfaces\ClpIStandardDsaEncoding.pas"/>
-        <UnitName Value="ClpIStandardDsaEncoding"/>
+        <Filename Value="..\..\Interfaces\ClpISchnorr.pas"/>
+        <UnitName Value="ClpISchnorr"/>
       </Item458>
       </Item458>
       <Item459>
       <Item459>
-        <Filename Value="..\..\Interfaces\ClpIPlainDsaEncoding.pas"/>
-        <UnitName Value="ClpIPlainDsaEncoding"/>
+        <Filename Value="..\..\Interfaces\ClpISchnorrExt.pas"/>
+        <UnitName Value="ClpISchnorrExt"/>
       </Item459>
       </Item459>
-      <Item460>
-        <Filename Value="..\..\Interfaces\ClpIDsaExt.pas"/>
-        <UnitName Value="ClpIDsaExt"/>
-      </Item460>
-      <Item461>
-        <Filename Value="..\..\Interfaces\ClpIDsaEncoding.pas"/>
-        <UnitName Value="ClpIDsaEncoding"/>
-      </Item461>
     </Files>
     </Files>
     <RequiredPkgs Count="3">
     <RequiredPkgs Count="3">
       <Item1>
       <Item1>

+ 11 - 12
CryptoLib/src/Packages/FPC/CryptoLib4PascalPackage.pas

@@ -90,9 +90,8 @@ uses
   ClpBase64, ClpHex, ClpStreamHelper, ClpBaseInputStream, ClpFilterStream, 
   ClpBase64, ClpHex, ClpStreamHelper, ClpBaseInputStream, ClpFilterStream, 
   ClpStreams, ClpOSRandom, ClpPcgRandomMinimal, ClpOSRandomNumberGenerator, 
   ClpStreams, ClpOSRandom, ClpPcgRandomMinimal, ClpOSRandomNumberGenerator, 
   ClpPCGRandomNumberGenerator, ClpRandomNumberGenerator, ClpSetWeakRef, 
   ClpPCGRandomNumberGenerator, ClpRandomNumberGenerator, ClpSetWeakRef, 
-  ClpDefiniteLengthInputStream, ClpECSchnorrSigner, ClpIECSchnorrSigner, 
-  ClpParameterUtilities, ClpGeneratorUtilities, ClpCipherUtilities, 
-  ClpIAesEngine, ClpIPkcs7Padding, ClpIParametersWithIV, 
+  ClpDefiniteLengthInputStream, ClpParameterUtilities, ClpGeneratorUtilities, 
+  ClpCipherUtilities, ClpIAesEngine, ClpIPkcs7Padding, ClpIParametersWithIV, 
   ClpIPaddedBufferedBlockCipher, ClpIKeyParameter, ClpICbcBlockCipher, 
   ClpIPaddedBufferedBlockCipher, ClpIKeyParameter, ClpICbcBlockCipher, 
   ClpIBufferedCipherBase, ClpIBufferedCipher, ClpIBufferedBlockCipher, 
   ClpIBufferedCipherBase, ClpIBufferedCipher, ClpIBufferedBlockCipher, 
   ClpIBlockCipherPadding, ClpIBlockCipher, ClpCbcBlockCipher, 
   ClpIBlockCipherPadding, ClpIBlockCipher, ClpCbcBlockCipher, 
@@ -118,14 +117,11 @@ uses
   ClpISO10126d2Padding, ClpIISO10126d2Padding, ClpPkcs5S2ParametersGenerator, 
   ClpISO10126d2Padding, ClpIISO10126d2Padding, ClpPkcs5S2ParametersGenerator, 
   ClpIPkcs5S2ParametersGenerator, ClpIPbeParametersGenerator, 
   ClpIPkcs5S2ParametersGenerator, ClpIPbeParametersGenerator, 
   ClpPbeParametersGenerator, ClpHMac, ClpMiscObjectIdentifiers, 
   ClpPbeParametersGenerator, ClpHMac, ClpMiscObjectIdentifiers, 
-  ClpIanaObjectIdentifiers, ClpMacUtilities, ClpIMac, ClpIHMac, 
-  ClpIECSchnorrLIBSECPSigner, ClpIECSchnorrISOXSigner, ClpIECSchnorrISOSigner, 
-  ClpIECSchnorrBSISigner, ClpISchnorr, ClpECSchnorrLIBSECPSigner, 
-  ClpECSchnorrISOXSigner, ClpECSchnorrISOSigner, ClpECSchnorrBSISigner, 
-  ClpDsaSigner, ClpDsaKeyPairGenerator, ClpECNRSigner, 
-  ClpDsaKeyGenerationParameters, ClpDsaPrivateKeyParameters, 
-  ClpDsaPublicKeyParameters, ClpDsaValidationParameters, ClpDsaParameters, 
-  ClpDsaKeyParameters, ClpIECNRSigner, ClpIDsaSigner, ClpIDsaKeyPairGenerator, 
+  ClpIanaObjectIdentifiers, ClpMacUtilities, ClpIMac, ClpIHMac, ClpDsaSigner, 
+  ClpDsaKeyPairGenerator, ClpECNRSigner, ClpDsaKeyGenerationParameters, 
+  ClpDsaPrivateKeyParameters, ClpDsaPublicKeyParameters, 
+  ClpDsaValidationParameters, ClpDsaParameters, ClpDsaKeyParameters, 
+  ClpIECNRSigner, ClpIDsaSigner, ClpIDsaKeyPairGenerator, 
   ClpIDsaPrivateKeyParameters, ClpIDsaKeyGenerationParameters, 
   ClpIDsaPrivateKeyParameters, ClpIDsaKeyGenerationParameters, 
   ClpIDsaKeyParameters, ClpIDsaPublicKeyParameters, ClpIDsaParameters, 
   ClpIDsaKeyParameters, ClpIDsaPublicKeyParameters, ClpIDsaParameters, 
   ClpIDsaValidationParameters, ClpBase58, ClpDigest, ClpECDHCBasicAgreement, 
   ClpIDsaValidationParameters, ClpBase58, ClpDigest, ClpECDHCBasicAgreement, 
@@ -151,7 +147,10 @@ uses
   ClpSecP256R1Point, ClpISecP256R1Curve, ClpSecP256R1Curve, 
   ClpSecP256R1Point, ClpISecP256R1Curve, ClpSecP256R1Curve, 
   ClpBsiObjectIdentifiers, ClpEacObjectIdentifiers, ClpPlainDsaEncoding, 
   ClpBsiObjectIdentifiers, ClpEacObjectIdentifiers, ClpPlainDsaEncoding, 
   ClpStandardDsaEncoding, ClpIStandardDsaEncoding, ClpIPlainDsaEncoding, 
   ClpStandardDsaEncoding, ClpIStandardDsaEncoding, ClpIPlainDsaEncoding, 
-  ClpIDsaExt, ClpIDsaEncoding;
+  ClpIDsaExt, ClpIDsaEncoding, ClpISchnorrDigestSigner, 
+  ClpIECSchnorrSipaSigner, ClpECSchnorrSipaSigner, ClpSchnorrDigestSigner, 
+  ClpPlainSchnorrEncoding, ClpIPlainSchnorrEncoding, ClpISchnorrEncoding, 
+  ClpISchnorr, ClpISchnorrExt;
 
 
 implementation
 implementation
 
 

+ 50 - 377
CryptoLib/src/Security/ClpSignerUtilities.pas

@@ -29,15 +29,6 @@ uses
   ClpIDigest,
   ClpIDigest,
   ClpDigestUtilities,
   ClpDigestUtilities,
   ClpDsaDigestSigner,
   ClpDsaDigestSigner,
-  ClpECSchnorrSigner,
-  ClpECSchnorrBSISigner,
-  ClpIECSchnorrBSISigner,
-  ClpECSchnorrISOSigner,
-  ClpIECSchnorrISOSigner,
-  ClpECSchnorrISOXSigner,
-  ClpIECSchnorrISOXSigner,
-  ClpECSchnorrLIBSECPSigner,
-  ClpIECSchnorrLIBSECPSigner,
   ClpX9ObjectIdentifiers,
   ClpX9ObjectIdentifiers,
   ClpEacObjectIdentifiers,
   ClpEacObjectIdentifiers,
   ClpBsiObjectIdentifiers,
   ClpBsiObjectIdentifiers,
@@ -55,6 +46,10 @@ uses
   ClpISecureRandom,
   ClpISecureRandom,
   ClpIDerObjectIdentifier,
   ClpIDerObjectIdentifier,
   ClpPlainDsaEncoding,
   ClpPlainDsaEncoding,
+  ClpPlainSchnorrEncoding,
+  ClpSchnorrDigestSigner,
+  ClpECSchnorrSipaSigner,
+  ClpIECSchnorrSipaSigner,
   ClpStringUtils,
   ClpStringUtils,
   ClpCryptoLibTypes;
   ClpCryptoLibTypes;
 
 
@@ -344,173 +339,46 @@ begin
   // Falgorithms.Add(TCryptoProObjectIdentifiers.GostR3411x94WithGostR3410x2001.id,
   // Falgorithms.Add(TCryptoProObjectIdentifiers.GostR3411x94WithGostR3410x2001.id,
   // 'ECGOST3410');
   // 'ECGOST3410');
 
 
-  // ECSCHNORR BSI
-
-  Falgorithms.Add('SHA1/ECSCHNORR/BSI', 'SHA-1withECSCHNORRBSI');
-  Falgorithms.Add('SHA-1/ECSCHNORR/BSI', 'SHA-1withECSCHNORRBSI');
-  Falgorithms.Add('ECSCHNORRBSIWITHSHA1', 'SHA-1withECSCHNORRBSI');
-  Falgorithms.Add('ECSCHNORRBSIWITHSHA-1', 'SHA-1withECSCHNORRBSI');
-  Falgorithms.Add('SHA1WITHECSCHNORRBSI', 'SHA-1withECSCHNORRBSI');
-  Falgorithms.Add('SHA-1WITHECSCHNORRBSI', 'SHA-1withECSCHNORRBSI');
-
-  Falgorithms.Add('SHA224/ECSCHNORR/BSI', 'SHA-224withECSCHNORRBSI');
-  Falgorithms.Add('SHA-224/ECSCHNORR/BSI', 'SHA-224withECSCHNORRBSI');
-  Falgorithms.Add('ECSCHNORRBSIWITHSHA224', 'SHA-224withECSCHNORRBSI');
-  Falgorithms.Add('ECSCHNORRBSIWITHSHA-224', 'SHA-224withECSCHNORRBSI');
-  Falgorithms.Add('SHA224WITHECSCHNORRBSI', 'SHA-224withECSCHNORRBSI');
-  Falgorithms.Add('SHA-224WITHECSCHNORRBSI', 'SHA-224withECSCHNORRBSI');
-
-  Falgorithms.Add('SHA256/ECSCHNORR/BSI', 'SHA-256withECSCHNORRBSI');
-  Falgorithms.Add('SHA-256/ECSCHNORR/BSI', 'SHA-256withECSCHNORRBSI');
-  Falgorithms.Add('ECSCHNORRBSIWITHSHA256', 'SHA-256withECSCHNORRBSI');
-  Falgorithms.Add('ECSCHNORRBSIWITHSHA-256', 'SHA-256withECSCHNORRBSI');
-  Falgorithms.Add('SHA256WITHECSCHNORRBSI', 'SHA-256withECSCHNORRBSI');
-  Falgorithms.Add('SHA-256WITHECSCHNORRBSI', 'SHA-256withECSCHNORRBSI');
-
-  Falgorithms.Add('SHA384/ECSCHNORR/BSI', 'SHA-384withECSCHNORRBSI');
-  Falgorithms.Add('SHA-384/ECSCHNORR/BSI', 'SHA-384withECSCHNORRBSI');
-  Falgorithms.Add('ECSCHNORRBSIWITHSHA384', 'SHA-384withECSCHNORRBSI');
-  Falgorithms.Add('ECSCHNORRBSIWITHSHA-384', 'SHA-384withECSCHNORRBSI');
-  Falgorithms.Add('SHA384WITHECSCHNORRBSI', 'SHA-384withECSCHNORRBSI');
-  Falgorithms.Add('SHA-384WITHECSCHNORRBSI', 'SHA-384withECSCHNORRBSI');
-
-  Falgorithms.Add('SHA512/ECSCHNORR/BSI', 'SHA-512withECSCHNORRBSI');
-  Falgorithms.Add('SHA-512/ECSCHNORR/BSI', 'SHA-512withECSCHNORRBSI');
-  Falgorithms.Add('ECSCHNORRBSIWITHSHA512', 'SHA-512withECSCHNORRBSI');
-  Falgorithms.Add('ECSCHNORRBSIWITHSHA-512', 'SHA-512withECSCHNORRBSI');
-  Falgorithms.Add('SHA512WITHECSCHNORRBSI', 'SHA-512withECSCHNORRBSI');
-  Falgorithms.Add('SHA-512WITHECSCHNORRBSI', 'SHA-512withECSCHNORRBSI');
-
-  Falgorithms.Add('RIPEMD160/ECSCHNORR/BSI', 'RIPEMD160withECSCHNORRBSI');
-  Falgorithms.Add('ECSCHNORRBSIWITHRIPEMD160', 'RIPEMD160withECSCHNORRBSI');
-  Falgorithms.Add('RIPEMD160WITHECSCHNORRBSI', 'RIPEMD160withECSCHNORRBSI');
-
-  // ECSCHNORR ISO
-
-  Falgorithms.Add('SHA1/ECSCHNORR/ISO', 'SHA-1withECSCHNORRISO');
-  Falgorithms.Add('SHA-1/ECSCHNORR/ISO', 'SHA-1withECSCHNORRISO');
-  Falgorithms.Add('ECSCHNORRISOWITHSHA1', 'SHA-1withECSCHNORRISO');
-  Falgorithms.Add('ECSCHNORRISOWITHSHA-1', 'SHA-1withECSCHNORRISO');
-  Falgorithms.Add('SHA1WITHECSCHNORRISO', 'SHA-1withECSCHNORRISO');
-  Falgorithms.Add('SHA-1WITHECSCHNORRISO', 'SHA-1withECSCHNORRISO');
-
-  Falgorithms.Add('SHA224/ECSCHNORR/ISO', 'SHA-224withECSCHNORRISO');
-  Falgorithms.Add('SHA-224/ECSCHNORR/ISO', 'SHA-224withECSCHNORRISO');
-  Falgorithms.Add('ECSCHNORRISOWITHSHA224', 'SHA-224withECSCHNORRISO');
-  Falgorithms.Add('ECSCHNORRISOWITHSHA-224', 'SHA-224withECSCHNORRISO');
-  Falgorithms.Add('SHA224WITHECSCHNORRISO', 'SHA-224withECSCHNORRISO');
-  Falgorithms.Add('SHA-224WITHECSCHNORRISO', 'SHA-224withECSCHNORRISO');
-
-  Falgorithms.Add('SHA256/ECSCHNORR/ISO', 'SHA-256withECSCHNORRISO');
-  Falgorithms.Add('SHA-256/ECSCHNORR/ISO', 'SHA-256withECSCHNORRISO');
-  Falgorithms.Add('ECSCHNORRISOWITHSHA256', 'SHA-256withECSCHNORRISO');
-  Falgorithms.Add('ECSCHNORRISOWITHSHA-256', 'SHA-256withECSCHNORRISO');
-  Falgorithms.Add('SHA256WITHECSCHNORRISO', 'SHA-256withECSCHNORRISO');
-  Falgorithms.Add('SHA-256WITHECSCHNORRISO', 'SHA-256withECSCHNORRISO');
-
-  Falgorithms.Add('SHA384/ECSCHNORR/ISO', 'SHA-384withECSCHNORRISO');
-  Falgorithms.Add('SHA-384/ECSCHNORR/ISO', 'SHA-384withECSCHNORRISO');
-  Falgorithms.Add('ECSCHNORRISOWITHSHA384', 'SHA-384withECSCHNORRISO');
-  Falgorithms.Add('ECSCHNORRISOWITHSHA-384', 'SHA-384withECSCHNORRISO');
-  Falgorithms.Add('SHA384WITHECSCHNORRISO', 'SHA-384withECSCHNORRISO');
-  Falgorithms.Add('SHA-384WITHECSCHNORRISO', 'SHA-384withECSCHNORRISO');
-
-  Falgorithms.Add('SHA512/ECSCHNORR/ISO', 'SHA-512withECSCHNORRISO');
-  Falgorithms.Add('SHA-512/ECSCHNORR/ISO', 'SHA-512withECSCHNORRISO');
-  Falgorithms.Add('ECSCHNORRISOWITHSHA512', 'SHA-512withECSCHNORRISO');
-  Falgorithms.Add('ECSCHNORRISOWITHSHA-512', 'SHA-512withECSCHNORRISO');
-  Falgorithms.Add('SHA512WITHECSCHNORRISO', 'SHA-512withECSCHNORRISO');
-  Falgorithms.Add('SHA-512WITHECSCHNORRISO', 'SHA-512withECSCHNORRISO');
-
-  Falgorithms.Add('RIPEMD160/ECSCHNORR/ISO', 'RIPEMD160withECSCHNORRISO');
-  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 LIBSECP
-
-  Falgorithms.Add('SHA1/ECSCHNORR/LIBSECP', 'SHA-1withECSCHNORRLIBSECP');
-  Falgorithms.Add('SHA-1/ECSCHNORR/LIBSECP', 'SHA-1withECSCHNORRLIBSECP');
-  Falgorithms.Add('ECSCHNORRLIBSECPWITHSHA1', 'SHA-1withECSCHNORRLIBSECP');
-  Falgorithms.Add('ECSCHNORRLIBSECPWITHSHA-1', 'SHA-1withECSCHNORRLIBSECP');
-  Falgorithms.Add('SHA1WITHECSCHNORRLIBSECP', 'SHA-1withECSCHNORRLIBSECP');
-  Falgorithms.Add('SHA-1WITHECSCHNORRLIBSECP', 'SHA-1withECSCHNORRLIBSECP');
-
-  Falgorithms.Add('SHA224/ECSCHNORR/LIBSECP', 'SHA-224withECSCHNORRLIBSECP');
-  Falgorithms.Add('SHA-224/ECSCHNORR/LIBSECP', 'SHA-224withECSCHNORRLIBSECP');
-  Falgorithms.Add('ECSCHNORRLIBSECPWITHSHA224', 'SHA-224withECSCHNORRLIBSECP');
-  Falgorithms.Add('ECSCHNORRLIBSECPWITHSHA-224', 'SHA-224withECSCHNORRLIBSECP');
-  Falgorithms.Add('SHA224WITHECSCHNORRLIBSECP', 'SHA-224withECSCHNORRLIBSECP');
-  Falgorithms.Add('SHA-224WITHECSCHNORRLIBSECP', 'SHA-224withECSCHNORRLIBSECP');
-
-  Falgorithms.Add('SHA256/ECSCHNORR/LIBSECP', 'SHA-256withECSCHNORRLIBSECP');
-  Falgorithms.Add('SHA-256/ECSCHNORR/LIBSECP', 'SHA-256withECSCHNORRLIBSECP');
-  Falgorithms.Add('ECSCHNORRLIBSECPWITHSHA256', 'SHA-256withECSCHNORRLIBSECP');
-  Falgorithms.Add('ECSCHNORRLIBSECPWITHSHA-256', 'SHA-256withECSCHNORRLIBSECP');
-  Falgorithms.Add('SHA256WITHECSCHNORRLIBSECP', 'SHA-256withECSCHNORRLIBSECP');
-  Falgorithms.Add('SHA-256WITHECSCHNORRLIBSECP', 'SHA-256withECSCHNORRLIBSECP');
-
-  Falgorithms.Add('SHA384/ECSCHNORR/LIBSECP', 'SHA-384withECSCHNORRLIBSECP');
-  Falgorithms.Add('SHA-384/ECSCHNORR/LIBSECP', 'SHA-384withECSCHNORRLIBSECP');
-  Falgorithms.Add('ECSCHNORRLIBSECPWITHSHA384', 'SHA-384withECSCHNORRLIBSECP');
-  Falgorithms.Add('ECSCHNORRLIBSECPWITHSHA-384', 'SHA-384withECSCHNORRLIBSECP');
-  Falgorithms.Add('SHA384WITHECSCHNORRLIBSECP', 'SHA-384withECSCHNORRLIBSECP');
-  Falgorithms.Add('SHA-384WITHECSCHNORRLIBSECP', 'SHA-384withECSCHNORRLIBSECP');
-
-  Falgorithms.Add('SHA512/ECSCHNORR/LIBSECP', 'SHA-512withECSCHNORRLIBSECP');
-  Falgorithms.Add('SHA-512/ECSCHNORR/LIBSECP', 'SHA-512withECSCHNORRLIBSECP');
-  Falgorithms.Add('ECSCHNORRLIBSECPWITHSHA512', 'SHA-512withECSCHNORRLIBSECP');
-  Falgorithms.Add('ECSCHNORRLIBSECPWITHSHA-512', 'SHA-512withECSCHNORRLIBSECP');
-  Falgorithms.Add('SHA512WITHECSCHNORRLIBSECP', 'SHA-512withECSCHNORRLIBSECP');
-  Falgorithms.Add('SHA-512WITHECSCHNORRLIBSECP', 'SHA-512withECSCHNORRLIBSECP');
-
-  Falgorithms.Add('RIPEMD160/ECSCHNORR/LIBSECP',
-    'RIPEMD160withECSCHNORRLIBSECP');
-  Falgorithms.Add('ECSCHNORRLIBSECPWITHRIPEMD160',
-    'RIPEMD160withECSCHNORRLIBSECP');
-  Falgorithms.Add('RIPEMD160WITHECSCHNORRLIBSECP',
-    'RIPEMD160withECSCHNORRLIBSECP');
+  // ECSCHNORR SIPA
+
+  Falgorithms.Add('SHA1/ECSCHNORR/SIPA', 'SHA-1withECSCHNORRSIPA');
+  Falgorithms.Add('SHA-1/ECSCHNORR/SIPA', 'SHA-1withECSCHNORRSIPA');
+  Falgorithms.Add('ECSCHNORRSIPAWITHSHA1', 'SHA-1withECSCHNORRSIPA');
+  Falgorithms.Add('ECSCHNORRSIPAWITHSHA-1', 'SHA-1withECSCHNORRSIPA');
+  Falgorithms.Add('SHA1WITHECSCHNORRSIPA', 'SHA-1withECSCHNORRSIPA');
+  Falgorithms.Add('SHA-1WITHECSCHNORRSIPA', 'SHA-1withECSCHNORRSIPA');
+
+  Falgorithms.Add('SHA224/ECSCHNORR/SIPA', 'SHA-224withECSCHNORRSIPA');
+  Falgorithms.Add('SHA-224/ECSCHNORR/SIPA', 'SHA-224withECSCHNORRSIPA');
+  Falgorithms.Add('ECSCHNORRSIPAWITHSHA224', 'SHA-224withECSCHNORRSIPA');
+  Falgorithms.Add('ECSCHNORRSIPAWITHSHA-224', 'SHA-224withECSCHNORRSIPA');
+  Falgorithms.Add('SHA224WITHECSCHNORRSIPA', 'SHA-224withECSCHNORRSIPA');
+  Falgorithms.Add('SHA-224WITHECSCHNORRSIPA', 'SHA-224withECSCHNORRSIPA');
+
+  Falgorithms.Add('SHA256/ECSCHNORR/SIPA', 'SHA-256withECSCHNORRSIPA');
+  Falgorithms.Add('SHA-256/ECSCHNORR/SIPA', 'SHA-256withECSCHNORRSIPA');
+  Falgorithms.Add('ECSCHNORRSIPAWITHSHA256', 'SHA-256withECSCHNORRSIPA');
+  Falgorithms.Add('ECSCHNORRSIPAWITHSHA-256', 'SHA-256withECSCHNORRSIPA');
+  Falgorithms.Add('SHA256WITHECSCHNORRSIPA', 'SHA-256withECSCHNORRSIPA');
+  Falgorithms.Add('SHA-256WITHECSCHNORRSIPA', 'SHA-256withECSCHNORRSIPA');
+
+  Falgorithms.Add('SHA384/ECSCHNORR/SIPA', 'SHA-384withECSCHNORRSIPA');
+  Falgorithms.Add('SHA-384/ECSCHNORR/SIPA', 'SHA-384withECSCHNORRSIPA');
+  Falgorithms.Add('ECSCHNORRSIPAWITHSHA384', 'SHA-384withECSCHNORRSIPA');
+  Falgorithms.Add('ECSCHNORRSIPAWITHSHA-384', 'SHA-384withECSCHNORRSIPA');
+  Falgorithms.Add('SHA384WITHECSCHNORRSIPA', 'SHA-384withECSCHNORRSIPA');
+  Falgorithms.Add('SHA-384WITHECSCHNORRSIPA', 'SHA-384withECSCHNORRSIPA');
+
+  Falgorithms.Add('SHA512/ECSCHNORR/SIPA', 'SHA-512withECSCHNORRSIPA');
+  Falgorithms.Add('SHA-512/ECSCHNORR/SIPA', 'SHA-512withECSCHNORRSIPA');
+  Falgorithms.Add('ECSCHNORRSIPAWITHSHA512', 'SHA-512withECSCHNORRSIPA');
+  Falgorithms.Add('ECSCHNORRSIPAWITHSHA-512', 'SHA-512withECSCHNORRSIPA');
+  Falgorithms.Add('SHA512WITHECSCHNORRSIPA', 'SHA-512withECSCHNORRSIPA');
+  Falgorithms.Add('SHA-512WITHECSCHNORRSIPA', 'SHA-512withECSCHNORRSIPA');
+
+  Falgorithms.Add('RIPEMD160/ECSCHNORR/SIPA', 'RIPEMD160withECSCHNORRSIPA');
+  Falgorithms.Add('ECSCHNORRSIPAWITHRIPEMD160', 'RIPEMD160withECSCHNORRSIPA');
+  Falgorithms.Add('RIPEMD160WITHECSCHNORRSIPA', 'RIPEMD160withECSCHNORRSIPA');
 
 
   Foids.Add('SHA-1withDSA', TX9ObjectIdentifiers.IdDsaWithSha1);
   Foids.Add('SHA-1withDSA', TX9ObjectIdentifiers.IdDsaWithSha1);
 
 
@@ -647,209 +515,14 @@ begin
     Exit;
     Exit;
   end;
   end;
 
 
-  if (mechanism = 'SHA-1withECSCHNORRBSI') then
+  if TStringUtils.EndsWith(mechanism, 'withECSCHNORRSIPA', True) then
   begin
   begin
-    DigestInstance := TDigestUtilities.GetDigest('SHA-1');
-
-    Result := TECSchnorrSigner.Create(TECSchnorrBSISigner.Create()
-      as IECSchnorrBSISigner, DigestInstance);
-    Exit;
-  end;
-  if (mechanism = 'SHA-224withECSCHNORRBSI') then
-  begin
-    DigestInstance := TDigestUtilities.GetDigest('SHA-224');
-
-    Result := TECSchnorrSigner.Create(TECSchnorrBSISigner.Create()
-      as IECSchnorrBSISigner, DigestInstance);
-    Exit;
-  end;
-  if (mechanism = 'SHA-256withECSCHNORRBSI') then
-  begin
-    DigestInstance := TDigestUtilities.GetDigest('SHA-256');
-
-    Result := TECSchnorrSigner.Create(TECSchnorrBSISigner.Create()
-      as IECSchnorrBSISigner, DigestInstance);
-    Exit;
-  end;
-  if (mechanism = 'SHA-384withECSCHNORRBSI') then
-  begin
-    DigestInstance := TDigestUtilities.GetDigest('SHA-384');
-
-    Result := TECSchnorrSigner.Create(TECSchnorrBSISigner.Create()
-      as IECSchnorrBSISigner, DigestInstance);
-    Exit;
-  end;
-  if (mechanism = 'SHA-512withECSCHNORRBSI') then
-  begin
-    DigestInstance := TDigestUtilities.GetDigest('SHA-512');
-
-    Result := TECSchnorrSigner.Create(TECSchnorrBSISigner.Create()
-      as IECSchnorrBSISigner, DigestInstance);
-    Exit;
-  end;
-
-  if (mechanism = 'RIPEMD160withECSCHNORRBSI') then
-  begin
-    DigestInstance := TDigestUtilities.GetDigest('RIPEMD-160');
-
-    Result := TECSchnorrSigner.Create(TECSchnorrBSISigner.Create()
-      as IECSchnorrBSISigner, DigestInstance);
-    Exit;
-  end;
-
-  //
-
-  if (mechanism = 'SHA-1withECSCHNORRISO') then
-  begin
-    DigestInstance := TDigestUtilities.GetDigest('SHA-1');
-
-    Result := TECSchnorrSigner.Create(TECSchnorrISOSigner.Create()
-      as IECSchnorrISOSigner, DigestInstance);
-    Exit;
-  end;
-  if (mechanism = 'SHA-224withECSCHNORRISO') then
-  begin
-    DigestInstance := TDigestUtilities.GetDigest('SHA-224');
-
-    Result := TECSchnorrSigner.Create(TECSchnorrISOSigner.Create()
-      as IECSchnorrISOSigner, DigestInstance);
-    Exit;
-  end;
-  if (mechanism = 'SHA-256withECSCHNORRISO') then
-  begin
-    DigestInstance := TDigestUtilities.GetDigest('SHA-256');
-
-    Result := TECSchnorrSigner.Create(TECSchnorrISOSigner.Create()
-      as IECSchnorrISOSigner, DigestInstance);
-    Exit;
-  end;
-  if (mechanism = 'SHA-384withECSCHNORRISO') then
-  begin
-    DigestInstance := TDigestUtilities.GetDigest('SHA-384');
-
-    Result := TECSchnorrSigner.Create(TECSchnorrISOSigner.Create()
-      as IECSchnorrISOSigner, DigestInstance);
-    Exit;
-  end;
-  if (mechanism = 'SHA-512withECSCHNORRISO') then
-  begin
-    DigestInstance := TDigestUtilities.GetDigest('SHA-512');
-
-    Result := TECSchnorrSigner.Create(TECSchnorrISOSigner.Create()
-      as IECSchnorrISOSigner, DigestInstance);
-    Exit;
-  end;
-
-  if (mechanism = 'RIPEMD160withECSCHNORRISO') then
-  begin
-    DigestInstance := TDigestUtilities.GetDigest('RIPEMD-160');
-
-    Result := TECSchnorrSigner.Create(TECSchnorrISOSigner.Create()
-      as IECSchnorrISOSigner, DigestInstance);
-    Exit;
-  end;
-
-  //
-
-  if (mechanism = 'SHA-1withECSCHNORRISOX') then
-  begin
-    DigestInstance := TDigestUtilities.GetDigest('SHA-1');
-
-    Result := TECSchnorrSigner.Create(TECSchnorrISOXSigner.Create()
-      as IECSchnorrISOXSigner, DigestInstance);
-    Exit;
-  end;
-  if (mechanism = 'SHA-224withECSCHNORRISOX') then
-  begin
-    DigestInstance := TDigestUtilities.GetDigest('SHA-224');
-
-    Result := TECSchnorrSigner.Create(TECSchnorrISOXSigner.Create()
-      as IECSchnorrISOXSigner, DigestInstance);
-    Exit;
-  end;
-  if (mechanism = 'SHA-256withECSCHNORRISOX') then
-  begin
-    DigestInstance := TDigestUtilities.GetDigest('SHA-256');
-
-    Result := TECSchnorrSigner.Create(TECSchnorrISOXSigner.Create()
-      as IECSchnorrISOXSigner, DigestInstance);
-    Exit;
-  end;
-  if (mechanism = 'SHA-384withECSCHNORRISOX') then
-  begin
-    DigestInstance := TDigestUtilities.GetDigest('SHA-384');
-
-    Result := TECSchnorrSigner.Create(TECSchnorrISOXSigner.Create()
-      as IECSchnorrISOXSigner, DigestInstance);
-    Exit;
-  end;
-  if (mechanism = 'SHA-512withECSCHNORRISOX') then
-  begin
-    DigestInstance := TDigestUtilities.GetDigest('SHA-512');
-
-    Result := TECSchnorrSigner.Create(TECSchnorrISOXSigner.Create()
-      as IECSchnorrISOXSigner, DigestInstance);
-    Exit;
-  end;
-
-  if (mechanism = 'RIPEMD160withECSCHNORRISOX') then
-  begin
-    DigestInstance := TDigestUtilities.GetDigest('RIPEMD-160');
-
-    Result := TECSchnorrSigner.Create(TECSchnorrISOXSigner.Create()
-      as IECSchnorrISOXSigner, DigestInstance);
-    Exit;
-  end;
-
-  //
-
-  if (mechanism = 'SHA-1withECSCHNORRLIBSECP') then
-  begin
-    DigestInstance := TDigestUtilities.GetDigest('SHA-1');
-
-    Result := TECSchnorrSigner.Create(TECSchnorrLIBSECPSigner.Create()
-      as IECSchnorrLIBSECPSigner, DigestInstance);
-    Exit;
-  end;
-  if (mechanism = 'SHA-224withECSCHNORRLIBSECP') then
-  begin
-    DigestInstance := TDigestUtilities.GetDigest('SHA-224');
-
-    Result := TECSchnorrSigner.Create(TECSchnorrLIBSECPSigner.Create()
-      as IECSchnorrLIBSECPSigner, DigestInstance);
-    Exit;
-  end;
-  if (mechanism = 'SHA-256withECSCHNORRLIBSECP') then
-  begin
-    DigestInstance := TDigestUtilities.GetDigest('SHA-256');
-
-    Result := TECSchnorrSigner.Create(TECSchnorrLIBSECPSigner.Create()
-      as IECSchnorrLIBSECPSigner, DigestInstance);
-    Exit;
-  end;
-  if (mechanism = 'SHA-384withECSCHNORRLIBSECP') then
-  begin
-    DigestInstance := TDigestUtilities.GetDigest('SHA-384');
-
-    Result := TECSchnorrSigner.Create(TECSchnorrLIBSECPSigner.Create()
-      as IECSchnorrLIBSECPSigner, DigestInstance);
-    Exit;
-  end;
-  if (mechanism = 'SHA-512withECSCHNORRLIBSECP') then
-  begin
-    DigestInstance := TDigestUtilities.GetDigest('SHA-512');
-
-    Result := TECSchnorrSigner.Create(TECSchnorrLIBSECPSigner.Create()
-      as IECSchnorrLIBSECPSigner, DigestInstance);
-    Exit;
-  end;
-
-  if (mechanism = 'RIPEMD160withECSCHNORRLIBSECP') then
-  begin
-    DigestInstance := TDigestUtilities.GetDigest('RIPEMD-160');
+    DigestName := System.Copy(mechanism, 1, TStringUtils.LastIndexOf(mechanism,
+      'with', True));
 
 
-    Result := TECSchnorrSigner.Create(TECSchnorrLIBSECPSigner.Create()
-      as IECSchnorrLIBSECPSigner, DigestInstance);
+    DigestInstance := TDigestUtilities.GetDigest(DigestName);
+    Result := TSchnorrDigestSigner.Create(TECSchnorrSipaSigner.Create()
+      as IECSchnorrSipaSigner, DigestInstance, TPlainSchnorrEncoding.Instance);
     Exit;
     Exit;
   end;
   end;
 
 

+ 4 - 12
README.md

@@ -41,17 +41,9 @@ secp112r2, sect163r2, secp128r2.
     SHA-256withECDSA, SHA-384withECDSA, SHA-512withECDSA and RIPEMD160withECDSA
     SHA-256withECDSA, SHA-384withECDSA, SHA-512withECDSA and RIPEMD160withECDSA
     
     
     ECSchnorr
     ECSchnorr
-    SHA-1withECSCHNORRBSI, SHA-224withECSCHNORRBSI, SHA-256withECSCHNORRBSI, SHA-384withECSCHNORRBSI,
-    SHA-512withECSCHNORRBSI, RIPEMD160withECSCHNORRBSI
+    SHA-1withECSCHNORRSIPA, SHA-224withECSCHNORRSIPA, SHA-256withECSCHNORRSIPA, SHA-384withECSCHNORRSIPA,
+    SHA-512withECSCHNORRSIPA, RIPEMD160withECSCHNORRSIPA
     
     
-    SHA-1withECSCHNORRISO, SHA-224withECSCHNORRISO, SHA-256withECSCHNORRISO, SHA-384withECSCHNORRISO, 
-    SHA-512withECSCHNORRISO, RIPEMD160withECSCHNORRISO
-    
-    SHA-1withECSCHNORRISOx, SHA-224withECSCHNORRISOx, SHA-256withECSCHNORRISOx, SHA-384withECSCHNORRISOx,
-    SHA-512withECSCHNORRISOx, RIPEMD160withECSCHNORRISOx 
-    
-    SHA-1withECSCHNORRLIBSECP, SHA-224withECSCHNORRLIBSECP, SHA-256withECSCHNORRLIBSECP, SHA-384withECSCHNORRLIBSECP,
-    SHA-512withECSCHNORRLIBSECP, RIPEMD160withECSCHNORRLIBSECP 
     
     
     
     
    **Dependencies:**
    **Dependencies:**
@@ -64,7 +56,7 @@ secp112r2, sect163r2, secp128r2.
 
 
 **Supported Compilers**
 **Supported Compilers**
  
  
-    FreePascal 3.0.0 and Above.
+    FreePascal 3.0.4 and Above.
     
     
     Delphi XE6 and Above. (might work in earlier versions though.)
     Delphi XE6 and Above. (might work in earlier versions though.)
 
 
@@ -86,7 +78,7 @@ secp112r2, sect163r2, secp128r2.
 
 
 To Run Unit Tests,
 To Run Unit Tests,
 
 
-**For FPC 3.0.0 and above**
+**For FPC 3.0.4 and above**
 
 
 
 
     Simply compile and run "CryptoLib.Tests" project in "FreePascal.Tests" Folder.
     Simply compile and run "CryptoLib.Tests" project in "FreePascal.Tests" Folder.