Browse Source

add support for brainpool curves

Ugochukwu Mmaduekwe 6 years ago
parent
commit
1d7829f5f3

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

@@ -337,6 +337,8 @@ uses
   ClpIEd25519PhBlake2BSigner in '..\..\CryptoLib\src\Interfaces\ClpIEd25519PhBlake2BSigner.pas',
   ClpEd25519PhSigner in '..\..\CryptoLib\src\Crypto\Signers\ClpEd25519PhSigner.pas',
   ClpEd25519PhBlake2BSigner in '..\..\CryptoLib\src\Crypto\Signers\ClpEd25519PhBlake2BSigner.pas',
+  ClpTeleTrusTNamedCurves in '..\..\CryptoLib\src\Asn1\TeleTrust\ClpTeleTrusTNamedCurves.pas',
+  ClpAgreementUtilities in '..\..\CryptoLib\src\Security\ClpAgreementUtilities.pas',
   UsageExamples in '..\src\UsageExamples.pas';
 
 begin

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

@@ -347,6 +347,8 @@ uses
   ClpIEd25519PhBlake2BSigner in '..\..\CryptoLib\src\Interfaces\ClpIEd25519PhBlake2BSigner.pas',
   ClpEd25519PhSigner in '..\..\CryptoLib\src\Crypto\Signers\ClpEd25519PhSigner.pas',
   ClpEd25519PhBlake2BSigner in '..\..\CryptoLib\src\Crypto\Signers\ClpEd25519PhBlake2BSigner.pas',
+  ClpTeleTrusTNamedCurves in '..\..\CryptoLib\src\Asn1\TeleTrust\ClpTeleTrusTNamedCurves.pas',
+  ClpAgreementUtilities in '..\..\CryptoLib\src\Security\ClpAgreementUtilities.pas',
   ClpFixedSecureRandom in '..\src\Utils\ClpFixedSecureRandom.pas',
   ClpIFixedSecureRandom in '..\src\Utils\ClpIFixedSecureRandom.pas',
   BlowfishTestVectors in '..\src\Crypto\BlowfishTestVectors.pas',

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

@@ -350,6 +350,8 @@ uses
   ClpIEd25519PhBlake2BSigner in '..\..\CryptoLib\src\Interfaces\ClpIEd25519PhBlake2BSigner.pas',
   ClpEd25519PhSigner in '..\..\CryptoLib\src\Crypto\Signers\ClpEd25519PhSigner.pas',
   ClpEd25519PhBlake2BSigner in '..\..\CryptoLib\src\Crypto\Signers\ClpEd25519PhBlake2BSigner.pas',
+  ClpTeleTrusTNamedCurves in '..\..\CryptoLib\src\Asn1\TeleTrust\ClpTeleTrusTNamedCurves.pas',
+  ClpAgreementUtilities in '..\..\CryptoLib\src\Security\ClpAgreementUtilities.pas',
   ClpFixedSecureRandom in '..\src\Utils\ClpFixedSecureRandom.pas',
   ClpIFixedSecureRandom in '..\src\Utils\ClpIFixedSecureRandom.pas',
   BlowfishTestVectors in '..\src\Crypto\BlowfishTestVectors.pas',

+ 66 - 60
CryptoLib.Tests/src/Others/NamedCurveTests.pas

@@ -32,10 +32,13 @@ uses
 {$ELSE}
   TestFramework,
 {$ENDIF FPC}
+  ClpBigInteger,
   ClpSecureRandom,
   ClpISecureRandom,
   ClpISigner,
+  ClpIBasicAgreement,
   ClpSecNamedCurves,
+  ClpTeleTrusTNamedCurves,
   ClpIX9ECParameters,
   ClpECDomainParameters,
   ClpECNamedCurveTable,
@@ -48,6 +51,8 @@ uses
   ClpIAsymmetricCipherKeyPairGenerator,
   ClpIAsymmetricCipherKeyPair,
   ClpIECKeyGenerationParameters,
+  ClpGeneratorUtilities,
+  ClpAgreementUtilities,
   ClpConverters,
   ClpCryptoLibTypes;
 
@@ -65,8 +70,8 @@ type
   TTestNamedCurve = class(TCryptoLibTestCase)
   private
     function GetCurveParameters(const name: String): IECDomainParameters;
-    procedure doTestECDsa(const name: String);
-    // procedure doTestECGost(const name: String);
+    procedure DoTestECDsa(const name: String);
+    procedure DoTestCurve(const name: String);
 
   protected
     procedure SetUp; override;
@@ -79,7 +84,7 @@ implementation
 
 { TTestNamedCurve }
 
-procedure TTestNamedCurve.doTestECDsa(const name: String);
+procedure TTestNamedCurve.DoTestECDsa(const name: String);
 var
   ecSpec: IECDomainParameters;
   g: IAsymmetricCipherKeyPairGenerator;
@@ -114,61 +119,55 @@ begin
 
   if (not sgr.VerifySignature(sigBytes)) then
   begin
-    Fail(name + ' verification failed');
+    Fail(Format('%s verification failed', [name]));
   end;
 end;
 
-// procedure TTestNamedCurve.doTestECGost(const name: String);
-// var
-// sgr: ISigner;
-// keyAlgorithm: String;
-// ecSpec: IECDomainParameters;
-// g: IAsymmetricCipherKeyPairGenerator;
-// pair: IAsymmetricCipherKeyPair;
-// sKey, vKey: IAsymmetricKeyParameter;
-// &message, sigBytes: TCryptoLibByteArray;
-// begin
-// if System.Pos('Tc26-Gost-3410', name) > 0 then
-// begin
-// // TODO Implement ECGOST3410-2012 in SignerUtilies/GeneratorUtilities etc.
-// // Current test cases don't work for GOST34.10 2012
-// Exit;
-// end
-// else
-// begin
-// keyAlgorithm := 'ECGOST3410';
-//
-// sgr := TSignerUtilities.GetSigner('ECGOST3410');
-// end;
-//
-// ecSpec := GetCurveParameters(name);
-//
-// g := TECKeyPairGenerator.Create(keyAlgorithm);
-//
-// g.Init(TECKeyGenerationParameters.Create(ecSpec, TSecureRandom.Create() as ISecureRandom) as IECKeyGenerationParameters);
-//
-// pair := g.GenerateKeyPair();
-// sKey := pair.Private;
-// vKey := pair.Public;
-//
-// sgr.Init(true, sKey);
-//
-// &message := TConverters.ConvertStringToBytes('abc', TEncoding.UTF8);
-//
-// sgr.BlockUpdate(&message, 0, System.Length(&message));
-//
-// sigBytes := sgr.GenerateSignature();
-//
-// sgr.Init(false, vKey);
-//
-// sgr.BlockUpdate(&message, 0, System.Length(&message));
-//
-// if (not sgr.VerifySignature(sigBytes)) then
-// begin
-// Fail(name + ' verification failed');
-// end;
-//
-// end;
+procedure TTestNamedCurve.DoTestCurve(const name: String);
+var
+  ecSpec: IECDomainParameters;
+  g: IAsymmetricCipherKeyPairGenerator;
+  aKeyPair, bKeyPair: IAsymmetricCipherKeyPair;
+  aKeyAgree, bKeyAgree: IBasicAgreement;
+  k1, k2: TBigInteger;
+begin
+  ecSpec := GetCurveParameters(name);
+
+  g := TGeneratorUtilities.GetKeyPairGenerator('ECDH');
+
+  g.Init(TECKeyGenerationParameters.Create(ecSpec, TSecureRandom.Create()
+    as ISecureRandom) as IECKeyGenerationParameters);
+
+  //
+  // a side
+  //
+  aKeyPair := g.GenerateKeyPair();
+
+  aKeyAgree := TAgreementUtilities.GetBasicAgreement('ECDHC');
+
+  aKeyAgree.Init(aKeyPair.Private);
+
+  //
+  // b side
+  //
+  bKeyPair := g.GenerateKeyPair();
+
+  bKeyAgree := TAgreementUtilities.GetBasicAgreement('ECDHC');
+
+  bKeyAgree.Init(bKeyPair.Private);
+
+  //
+  // agreement
+  //
+
+  k1 := aKeyAgree.CalculateAgreement(bKeyPair.Public);
+  k2 := bKeyAgree.CalculateAgreement(aKeyPair.Public);
+
+  if (not k1.Equals(k2)) then
+  begin
+    Fail('2-way test failed');
+  end;
+end;
 
 function TTestNamedCurve.GetCurveParameters(const name: String)
   : IECDomainParameters;
@@ -211,15 +210,22 @@ procedure TTestNamedCurve.TestPerform;
 var
   name: string;
 begin
+  DoTestCurve('sect571r1'); // sec
+  DoTestCurve('secp224r1');
+  DoTestCurve('B-409'); // nist
+  DoTestCurve('P-521');
+  DoTestCurve('brainpoolp160r1'); // TeleTrusT
+
   for name in TSecNamedCurves.Names do
   begin
-    doTestECDsa(name);
+    DoTestECDsa(name);
+  end;
+
+  for name in TTeleTrusTNamedCurves.Names do
+  begin
+    DoTestECDsa(name);
   end;
 
-  // for name in TECGost3410NamedCurves.Names do
-  // begin
-  // doTestECGost(name);
-  // end;
 end;
 
 initialization

+ 968 - 0
CryptoLib/src/Asn1/TeleTrust/ClpTeleTrusTNamedCurves.pas

@@ -0,0 +1,968 @@
+{ *********************************************************************************** }
+{ *                              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 ClpTeleTrusTNamedCurves;
+
+{$I ..\..\Include\CryptoLib.inc}
+
+interface
+
+uses
+  SysUtils,
+  Generics.Collections,
+  ClpEncoders,
+  ClpTeleTrusTObjectIdentifiers,
+  ClpCryptoLibTypes,
+  ClpBigInteger,
+  ClpECC,
+  ClpIECC,
+  ClpX9ECC,
+  ClpIX9ECC,
+  ClpIAsn1Objects,
+  ClpX9ECParameters,
+  ClpIX9ECParameters,
+  ClpX9ECParametersHolder,
+  ClpIX9ECParametersHolder;
+
+type
+
+  /// <summary>
+  /// elliptic curves defined in 'ECC Brainpool Standard Curves and Curve
+  /// Generation' <br /><see href="http://www.ecc-brainpool.org/download/draft_pkix_additional_ecc_dp.txt" />
+  /// </summary>
+  TTeleTrusTNamedCurves = class sealed(TObject)
+
+  strict private
+
+  class var
+    FobjIds: TDictionary<String, IDerObjectIdentifier>;
+    Fnames: TDictionary<IDerObjectIdentifier, String>;
+    Fcurves: TDictionary<IDerObjectIdentifier, IX9ECParametersHolder>;
+
+    class function GetNames: TCryptoLibStringArray; static; inline;
+    class procedure DefineCurve(const name: String;
+      const oid: IDerObjectIdentifier; const holder: IX9ECParametersHolder);
+      static; inline;
+
+    class function ConfigureCurve(const curve: IECCurve): IECCurve;
+      static; inline;
+
+    class procedure Boot(); static;
+    class constructor CreateTeleTrusTNamedCurves();
+    class destructor DestroyTeleTrusTNamedCurves();
+
+  public
+    class function GetByName(const name: String): IX9ECParameters;
+      static; inline;
+    // /**
+    // * return the X9ECParameters object for the named curve represented by
+    // * the passed in object identifier. Null if the curve isn't present.
+    // *
+    // * @param oid an object identifier representing a named curve, if present.
+    // */
+    class function GetByOid(const oid: IDerObjectIdentifier): IX9ECParameters;
+      static; inline;
+    // /**
+    // * return the object identifier signified by the passed in name. Null
+    // * if there is no object identifier associated with name.
+    // *
+    // * @return the object identifier associated with name, if present.
+    // */
+    class function GetOid(const name: String): IDerObjectIdentifier;
+      static; inline;
+    // /**
+    // * return the named curve name represented by the given object identifier.
+    // */
+    class function GetName(const oid: IDerObjectIdentifier): String;
+      static; inline;
+    // /**
+    // * returns an enumeration containing the name strings for curves
+    // * contained in this structure.
+    // */
+    class property Names: TCryptoLibStringArray read GetNames;
+
+  type
+
+    /// <summary>
+    /// brainpoolP160r1
+    /// </summary>
+    TBrainpoolP160r1Holder = class sealed(TX9ECParametersHolder,
+      IX9ECParametersHolder)
+
+    strict protected
+      function CreateParameters(): IX9ECParameters; override;
+
+    public
+      class function Instance(): IX9ECParametersHolder; static;
+
+    end;
+
+  type
+
+    /// <summary>
+    /// brainpoolP160t1
+    /// </summary>
+    TBrainpoolP160t1Holder = class sealed(TX9ECParametersHolder,
+      IX9ECParametersHolder)
+
+    strict protected
+      function CreateParameters(): IX9ECParameters; override;
+
+    public
+      class function Instance(): IX9ECParametersHolder; static;
+
+    end;
+
+  type
+
+    /// <summary>
+    /// brainpoolP192r1
+    /// </summary>
+    TBrainpoolP192r1Holder = class sealed(TX9ECParametersHolder,
+      IX9ECParametersHolder)
+
+    strict protected
+      function CreateParameters(): IX9ECParameters; override;
+
+    public
+      class function Instance(): IX9ECParametersHolder; static;
+
+    end;
+
+  type
+
+    /// <summary>
+    /// brainpoolP192t1
+    /// </summary>
+    TBrainpoolP192t1Holder = class sealed(TX9ECParametersHolder,
+      IX9ECParametersHolder)
+
+    strict protected
+      function CreateParameters(): IX9ECParameters; override;
+
+    public
+      class function Instance(): IX9ECParametersHolder; static;
+
+    end;
+
+  type
+
+    /// <summary>
+    /// brainpoolP224r1
+    /// </summary>
+    TBrainpoolP224r1Holder = class sealed(TX9ECParametersHolder,
+      IX9ECParametersHolder)
+
+    strict protected
+      function CreateParameters(): IX9ECParameters; override;
+
+    public
+      class function Instance(): IX9ECParametersHolder; static;
+
+    end;
+
+  type
+
+    /// <summary>
+    /// brainpoolP224t1
+    /// </summary>
+    TBrainpoolP224t1Holder = class sealed(TX9ECParametersHolder,
+      IX9ECParametersHolder)
+
+    strict protected
+      function CreateParameters(): IX9ECParameters; override;
+
+    public
+      class function Instance(): IX9ECParametersHolder; static;
+
+    end;
+
+  type
+
+    /// <summary>
+    /// brainpoolP256r1
+    /// </summary>
+    TBrainpoolP256r1Holder = class sealed(TX9ECParametersHolder,
+      IX9ECParametersHolder)
+
+    strict protected
+      function CreateParameters(): IX9ECParameters; override;
+
+    public
+      class function Instance(): IX9ECParametersHolder; static;
+
+    end;
+
+  type
+
+    /// <summary>
+    /// brainpoolP256t1
+    /// </summary>
+    TBrainpoolP256t1Holder = class sealed(TX9ECParametersHolder,
+      IX9ECParametersHolder)
+
+    strict protected
+      function CreateParameters(): IX9ECParameters; override;
+
+    public
+      class function Instance(): IX9ECParametersHolder; static;
+
+    end;
+
+  type
+
+    /// <summary>
+    /// brainpoolP320r1
+    /// </summary>
+    TBrainpoolP320r1Holder = class sealed(TX9ECParametersHolder,
+      IX9ECParametersHolder)
+
+    strict protected
+      function CreateParameters(): IX9ECParameters; override;
+
+    public
+      class function Instance(): IX9ECParametersHolder; static;
+
+    end;
+
+  type
+
+    /// <summary>
+    /// brainpoolP320t1
+    /// </summary>
+    TBrainpoolP320t1Holder = class sealed(TX9ECParametersHolder,
+      IX9ECParametersHolder)
+
+    strict protected
+      function CreateParameters(): IX9ECParameters; override;
+
+    public
+      class function Instance(): IX9ECParametersHolder; static;
+
+    end;
+
+  type
+
+    /// <summary>
+    /// brainpoolP384r1
+    /// </summary>
+    TBrainpoolP384r1Holder = class sealed(TX9ECParametersHolder,
+      IX9ECParametersHolder)
+
+    strict protected
+      function CreateParameters(): IX9ECParameters; override;
+
+    public
+      class function Instance(): IX9ECParametersHolder; static;
+
+    end;
+
+  type
+
+    /// <summary>
+    /// brainpoolP384t1
+    /// </summary>
+    TBrainpoolP384t1Holder = class sealed(TX9ECParametersHolder,
+      IX9ECParametersHolder)
+
+    strict protected
+      function CreateParameters(): IX9ECParameters; override;
+
+    public
+      class function Instance(): IX9ECParametersHolder; static;
+
+    end;
+
+  type
+
+    /// <summary>
+    /// brainpoolP512r1
+    /// </summary>
+    TBrainpoolP512r1Holder = class sealed(TX9ECParametersHolder,
+      IX9ECParametersHolder)
+
+    strict protected
+      function CreateParameters(): IX9ECParameters; override;
+
+    public
+      class function Instance(): IX9ECParametersHolder; static;
+
+    end;
+
+  type
+
+    /// <summary>
+    /// brainpoolP512t1
+    /// </summary>
+    TBrainpoolP512t1Holder = class sealed(TX9ECParametersHolder,
+      IX9ECParametersHolder)
+
+    strict protected
+      function CreateParameters(): IX9ECParameters; override;
+
+    public
+      class function Instance(): IX9ECParametersHolder; static;
+
+    end;
+
+  end;
+
+implementation
+
+{ TeleTrusTNamedCurves }
+
+class procedure TTeleTrusTNamedCurves.Boot;
+begin
+  FobjIds := TDictionary<String, IDerObjectIdentifier>.Create();
+  Fnames := TDictionary<IDerObjectIdentifier, String>.Create();
+  Fcurves := TDictionary<IDerObjectIdentifier, IX9ECParametersHolder>.Create();
+
+  DefineCurve('brainpoolP160r1', TTeleTrusTObjectIdentifiers.BrainpoolP160R1,
+    TBrainpoolP160r1Holder.Instance);
+  DefineCurve('brainpoolP160t1', TTeleTrusTObjectIdentifiers.BrainpoolP160T1,
+    TBrainpoolP160t1Holder.Instance);
+  DefineCurve('brainpoolP192r1', TTeleTrusTObjectIdentifiers.BrainpoolP192R1,
+    TBrainpoolP160t1Holder.Instance);
+  DefineCurve('brainpoolP192t1', TTeleTrusTObjectIdentifiers.BrainpoolP192T1,
+    TBrainpoolP192t1Holder.Instance);
+  DefineCurve('brainpoolP224r1', TTeleTrusTObjectIdentifiers.BrainpoolP224R1,
+    TBrainpoolP224r1Holder.Instance);
+  DefineCurve('brainpoolP224t1', TTeleTrusTObjectIdentifiers.BrainpoolP224T1,
+    TBrainpoolP224t1Holder.Instance);
+  DefineCurve('brainpoolP256r1', TTeleTrusTObjectIdentifiers.BrainpoolP256R1,
+    TBrainpoolP256r1Holder.Instance);
+  DefineCurve('brainpoolP256t1', TTeleTrusTObjectIdentifiers.BrainpoolP256T1,
+    TBrainpoolP256t1Holder.Instance);
+  DefineCurve('brainpoolP320r1', TTeleTrusTObjectIdentifiers.BrainpoolP320R1,
+    TBrainpoolP320r1Holder.Instance);
+  DefineCurve('brainpoolP320t1', TTeleTrusTObjectIdentifiers.BrainpoolP320T1,
+    TBrainpoolP320t1Holder.Instance);
+  DefineCurve('brainpoolP384r1', TTeleTrusTObjectIdentifiers.BrainpoolP384R1,
+    TBrainpoolP384r1Holder.Instance);
+  DefineCurve('brainpoolP384t1', TTeleTrusTObjectIdentifiers.BrainpoolP384T1,
+    TBrainpoolP384t1Holder.Instance);
+  DefineCurve('brainpoolP512r1', TTeleTrusTObjectIdentifiers.BrainpoolP512R1,
+    TBrainpoolP512r1Holder.Instance);
+  DefineCurve('brainpoolP512t1', TTeleTrusTObjectIdentifiers.BrainpoolP512T1,
+    TBrainpoolP512t1Holder.Instance);
+end;
+
+class function TTeleTrusTNamedCurves.ConfigureCurve(const curve: IECCurve)
+  : IECCurve;
+begin
+  result := curve;
+end;
+
+class constructor TTeleTrusTNamedCurves.CreateTeleTrusTNamedCurves;
+begin
+  TTeleTrusTNamedCurves.Boot;
+end;
+
+class destructor TTeleTrusTNamedCurves.DestroyTeleTrusTNamedCurves;
+begin
+  FobjIds.Free;
+  Fnames.Free;
+  Fcurves.Free;
+end;
+
+class procedure TTeleTrusTNamedCurves.DefineCurve(const name: String;
+  const oid: IDerObjectIdentifier; const holder: IX9ECParametersHolder);
+begin
+  FobjIds.Add(UpperCase(name), oid);
+  Fnames.Add(oid, name);
+  Fcurves.Add(oid, holder);
+end;
+
+class function TTeleTrusTNamedCurves.GetByOid(const oid: IDerObjectIdentifier)
+  : IX9ECParameters;
+var
+  holder: IX9ECParametersHolder;
+begin
+  if Fcurves.TryGetValue(oid, holder) then
+  begin
+    result := holder.Parameters
+  end
+  else
+  begin
+    result := Nil;
+  end;
+end;
+
+class function TTeleTrusTNamedCurves.GetOid(const name: String)
+  : IDerObjectIdentifier;
+begin
+  if not(FobjIds.TryGetValue(UpperCase(name), result)) then
+  begin
+    result := Nil;
+  end;
+end;
+
+class function TTeleTrusTNamedCurves.GetByName(const name: String)
+  : IX9ECParameters;
+var
+  oid: IDerObjectIdentifier;
+begin
+  oid := GetOid(name);
+  if oid = Nil then
+  begin
+    result := Nil;
+  end
+  else
+  begin
+    result := GetByOid(oid);
+  end;
+end;
+
+class function TTeleTrusTNamedCurves.GetName
+  (const oid: IDerObjectIdentifier): String;
+begin
+  if not(Fnames.TryGetValue(oid, result)) then
+  begin
+    result := '';
+  end;
+end;
+
+class function TTeleTrusTNamedCurves.GetNames: TCryptoLibStringArray;
+begin
+  result := Fnames.Values.ToArray();
+end;
+
+{ TeleTrusTNamedCurves.TBrainpoolP160r1Holder }
+
+function TTeleTrusTNamedCurves.TBrainpoolP160r1Holder.CreateParameters
+  : IX9ECParameters;
+var
+  n, h: TBigInteger;
+  curve: IECCurve;
+begin
+  n := TBigInteger.Create('E95E4A5F737059DC60DF5991D45029409E60FC09', 16);
+  h := TBigInteger.Create('01', 16);
+
+  curve := ConfigureCurve
+    (TFpCurve.Create(TBigInteger.Create
+    ('E95E4A5F737059DC60DFC7AD95B3D8139515620F', 16), // q
+    TBigInteger.Create('340E7BE2A280EB74E2BE61BADA745D97E8F7C300', 16), // a
+    TBigInteger.Create('1E589A8595423412134FAA2DBDEC95C8D8675E58', 16), // b
+    n, h) as IFpCurve);
+
+  result := TX9ECParameters.Create(curve, TX9ECPoint.Create(curve,
+    THex.Decode
+    ('04BED5AF16EA3F6A4F62938C4631EB5AF7BDBCDBC31667CB477A1A8EC338F94741669C976316DA6321')
+    ) as IX9ECPoint, // G
+    n, h);
+end;
+
+class function TTeleTrusTNamedCurves.TBrainpoolP160r1Holder.Instance
+  : IX9ECParametersHolder;
+begin
+  result := TBrainpoolP160r1Holder.Create();
+end;
+
+{ TeleTrusTNamedCurves.TBrainpoolP160t1Holder }
+
+function TTeleTrusTNamedCurves.TBrainpoolP160t1Holder.CreateParameters
+  : IX9ECParameters;
+var
+  n, h: TBigInteger;
+  curve: IECCurve;
+begin
+  n := TBigInteger.Create('E95E4A5F737059DC60DF5991D45029409E60FC09', 16);
+  h := TBigInteger.Create('01', 16);
+
+  curve := ConfigureCurve
+    (TFpCurve.Create(TBigInteger.Create
+    ('E95E4A5F737059DC60DFC7AD95B3D8139515620F', 16), // q
+    TBigInteger.Create('E95E4A5F737059DC60DFC7AD95B3D8139515620C', 16), // a'
+    TBigInteger.Create('7A556B6DAE535B7B51ED2C4D7DAA7A0B5C55F380', 16), // b'
+    n, h) as IFpCurve);
+
+  result := TX9ECParameters.Create(curve, TX9ECPoint.Create(curve,
+    THex.Decode
+    ('04B199B13B9B34EFC1397E64BAEB05ACC265FF2378ADD6718B7C7C1961F0991B842443772152C9E0AD')
+    ) as IX9ECPoint, // G'
+    n, h);
+end;
+
+class function TTeleTrusTNamedCurves.TBrainpoolP160t1Holder.Instance
+  : IX9ECParametersHolder;
+begin
+  result := TBrainpoolP160t1Holder.Create();
+end;
+
+{ TeleTrusTNamedCurves.TBrainpoolP192r1Holder }
+
+function TTeleTrusTNamedCurves.TBrainpoolP192r1Holder.CreateParameters
+  : IX9ECParameters;
+var
+  n, h: TBigInteger;
+  curve: IECCurve;
+begin
+  n := TBigInteger.Create
+    ('C302F41D932A36CDA7A3462F9E9E916B5BE8F1029AC4ACC1', 16);
+  h := TBigInteger.Create('01', 16);
+
+  curve := ConfigureCurve
+    (TFpCurve.Create(TBigInteger.Create
+    ('C302F41D932A36CDA7A3463093D18DB78FCE476DE1A86297', 16), // q
+    TBigInteger.Create('6A91174076B1E0E19C39C031FE8685C1CAE040E5C69A28EF', 16),
+    // a
+    TBigInteger.Create('469A28EF7C28CCA3DC721D044F4496BCCA7EF4146FBF25C9', 16),
+    // b
+    n, h) as IFpCurve);
+
+  result := TX9ECParameters.Create(curve, TX9ECPoint.Create(curve,
+    THex.Decode
+    ('04C0A0647EAAB6A48753B033C56CB0F0900A2F5C4853375FD614B690866ABD5BB88B5F4828C1490002E6773FA2FA299B8F')
+    ) as IX9ECPoint, // G
+    n, h);
+end;
+
+class function TTeleTrusTNamedCurves.TBrainpoolP192r1Holder.Instance
+  : IX9ECParametersHolder;
+begin
+  result := TBrainpoolP192r1Holder.Create();
+end;
+
+{ TeleTrusTNamedCurves.TBrainpoolP192t1Holder }
+
+function TTeleTrusTNamedCurves.TBrainpoolP192t1Holder.CreateParameters
+  : IX9ECParameters;
+var
+  n, h: TBigInteger;
+  curve: IECCurve;
+begin
+  n := TBigInteger.Create
+    ('C302F41D932A36CDA7A3462F9E9E916B5BE8F1029AC4ACC1', 16);
+  h := TBigInteger.Create('01', 16);
+
+  curve := ConfigureCurve
+    (TFpCurve.Create(TBigInteger.Create
+    ('C302F41D932A36CDA7A3463093D18DB78FCE476DE1A86297', 16), // q
+    TBigInteger.Create('C302F41D932A36CDA7A3463093D18DB78FCE476DE1A86294', 16),
+    // a'
+    TBigInteger.Create('13D56FFAEC78681E68F9DEB43B35BEC2FB68542E27897B79', 16),
+    // b'
+    n, h) as IFpCurve);
+
+  result := TX9ECParameters.Create(curve, TX9ECPoint.Create(curve,
+    THex.Decode
+    ('043AE9E58C82F63C30282E1FE7BBF43FA72C446AF6F4618129097E2C5667C2223A902AB5CA449D0084B7E5B3DE7CCC01C9')
+    ) as IX9ECPoint, // G'
+    n, h);
+end;
+
+class function TTeleTrusTNamedCurves.TBrainpoolP192t1Holder.Instance
+  : IX9ECParametersHolder;
+begin
+  result := TBrainpoolP192t1Holder.Create();
+end;
+
+{ TeleTrusTNamedCurves.TBrainpoolP224r1Holder }
+
+function TTeleTrusTNamedCurves.TBrainpoolP224r1Holder.CreateParameters
+  : IX9ECParameters;
+var
+  n, h: TBigInteger;
+  curve: IECCurve;
+begin
+  n := TBigInteger.Create
+    ('D7C134AA264366862A18302575D0FB98D116BC4B6DDEBCA3A5A7939F', 16);
+  h := TBigInteger.Create('01', 16);
+
+  curve := ConfigureCurve
+    (TFpCurve.Create(TBigInteger.Create
+    ('D7C134AA264366862A18302575D1D787B09F075797DA89F57EC8C0FF', 16), // q
+    TBigInteger.Create
+    ('68A5E62CA9CE6C1C299803A6C1530B514E182AD8B0042A59CAD29F43', 16),
+    // a
+    TBigInteger.Create
+    ('2580F63CCFE44138870713B1A92369E33E2135D266DBB372386C400B', 16),
+    // b
+    n, h) as IFpCurve);
+
+  result := TX9ECParameters.Create(curve, TX9ECPoint.Create(curve,
+    THex.Decode
+    ('040D9029AD2C7E5CF4340823B2A87DC68C9E4CE3174C1E6EFDEE12C07D58AA56F772C0726F24C6B89E4ECDAC24354B9E99CAA3F6D3761402CD')
+    ) as IX9ECPoint, // G
+    n, h);
+end;
+
+class function TTeleTrusTNamedCurves.TBrainpoolP224r1Holder.Instance
+  : IX9ECParametersHolder;
+begin
+  result := TBrainpoolP224r1Holder.Create();
+end;
+
+{ TeleTrusTNamedCurves.TBrainpoolP224t1Holder }
+
+function TTeleTrusTNamedCurves.TBrainpoolP224t1Holder.CreateParameters
+  : IX9ECParameters;
+var
+  n, h: TBigInteger;
+  curve: IECCurve;
+begin
+  n := TBigInteger.Create
+    ('D7C134AA264366862A18302575D0FB98D116BC4B6DDEBCA3A5A7939F', 16);
+  h := TBigInteger.Create('01', 16);
+
+  curve := ConfigureCurve
+    (TFpCurve.Create(TBigInteger.Create
+    ('D7C134AA264366862A18302575D1D787B09F075797DA89F57EC8C0FF', 16), // q
+    TBigInteger.Create
+    ('D7C134AA264366862A18302575D1D787B09F075797DA89F57EC8C0FC', 16),
+    // a'
+    TBigInteger.Create
+    ('4B337D934104CD7BEF271BF60CED1ED20DA14C08B3BB64F18A60888D', 16),
+    // b'
+    n, h) as IFpCurve);
+
+  result := TX9ECParameters.Create(curve, TX9ECPoint.Create(curve,
+    THex.Decode
+    ('046AB1E344CE25FF3896424E7FFE14762ECB49F8928AC0C76029B4D5800374E9F5143E568CD23F3F4D7C0D4B1E41C8CC0D1C6ABD5F1A46DB4C')
+    ) as IX9ECPoint, // G'
+    n, h);
+end;
+
+class function TTeleTrusTNamedCurves.TBrainpoolP224t1Holder.Instance
+  : IX9ECParametersHolder;
+begin
+  result := TBrainpoolP224t1Holder.Create();
+end;
+
+{ TeleTrusTNamedCurves.TBrainpoolP256r1Holder }
+
+function TTeleTrusTNamedCurves.TBrainpoolP256r1Holder.CreateParameters
+  : IX9ECParameters;
+var
+  n, h: TBigInteger;
+  curve: IECCurve;
+begin
+  n := TBigInteger.Create
+    ('A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A7', 16);
+  h := TBigInteger.Create('01', 16);
+
+  curve := ConfigureCurve
+    (TFpCurve.Create(TBigInteger.Create
+    ('A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E5377', 16),
+    // q
+    TBigInteger.Create
+    ('7D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9', 16),
+    // a
+    TBigInteger.Create
+    ('26DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCDC18FF8C07B6', 16),
+    // b
+    n, h) as IFpCurve);
+
+  result := TX9ECParameters.Create(curve, TX9ECPoint.Create(curve,
+    THex.Decode
+    ('048BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F046997')
+    ) as IX9ECPoint, // G
+    n, h);
+end;
+
+class function TTeleTrusTNamedCurves.TBrainpoolP256r1Holder.Instance
+  : IX9ECParametersHolder;
+begin
+  result := TBrainpoolP256r1Holder.Create();
+end;
+
+{ TeleTrusTNamedCurves.TBrainpoolP256t1Holder }
+
+function TTeleTrusTNamedCurves.TBrainpoolP256t1Holder.CreateParameters
+  : IX9ECParameters;
+var
+  n, h: TBigInteger;
+  curve: IECCurve;
+begin
+  n := TBigInteger.Create
+    ('A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A7', 16);
+  h := TBigInteger.Create('01', 16);
+
+  curve := ConfigureCurve
+    (TFpCurve.Create(TBigInteger.Create
+    ('A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E5377', 16),
+    // q
+    TBigInteger.Create
+    ('A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E5374', 16),
+    // a'
+    TBigInteger.Create
+    ('662C61C430D84EA4FE66A7733D0B76B7BF93EBC4AF2F49256AE58101FEE92B04', 16),
+    // b'
+    n, h) as IFpCurve);
+
+  result := TX9ECParameters.Create(curve, TX9ECPoint.Create(curve,
+    THex.Decode
+    ('04A3E8EB3CC1CFE7B7732213B23A656149AFA142C47AAFBC2B79A191562E1305F42D996C823439C56D7F7B22E14644417E69BCB6DE39D027001DABE8F35B25C9BE')
+    ) as IX9ECPoint, // G'
+    n, h);
+end;
+
+class function TTeleTrusTNamedCurves.TBrainpoolP256t1Holder.Instance
+  : IX9ECParametersHolder;
+begin
+  result := TBrainpoolP256t1Holder.Create();
+end;
+
+{ TeleTrusTNamedCurves.TBrainpoolP320r1Holder }
+
+function TTeleTrusTNamedCurves.TBrainpoolP320r1Holder.CreateParameters
+  : IX9ECParameters;
+var
+  n, h: TBigInteger;
+  curve: IECCurve;
+begin
+  n := TBigInteger.Create
+    ('D35E472036BC4FB7E13C785ED201E065F98FCFA5B68F12A32D482EC7EE8658E98691555B44C59311',
+    16);
+  h := TBigInteger.Create('01', 16);
+
+  curve := ConfigureCurve
+    (TFpCurve.Create(TBigInteger.Create
+    ('D35E472036BC4FB7E13C785ED201E065F98FCFA6F6F40DEF4F92B9EC7893EC28FCD412B1F1B32E27',
+    16),
+    // q
+    TBigInteger.Create
+    ('3EE30B568FBAB0F883CCEBD46D3F3BB8A2A73513F5EB79DA66190EB085FFA9F492F375A97D860EB4',
+    16),
+    // a
+    TBigInteger.Create
+    ('520883949DFDBC42D3AD198640688A6FE13F41349554B49ACC31DCCD884539816F5EB4AC8FB1F1A6',
+    16),
+    // b
+    n, h) as IFpCurve);
+
+  result := TX9ECParameters.Create(curve, TX9ECPoint.Create(curve,
+    THex.Decode
+    ('0443BD7E9AFB53D8B85289BCC48EE5BFE6F20137D10A087EB6E7871E2A10A599C710AF8D0D39E2061114FDD05545EC1CC8AB4093247F77275E0743FFED117182EAA9C77877AAAC6AC7D35245D1692E8EE1')
+    ) as IX9ECPoint, // G
+    n, h);
+end;
+
+class function TTeleTrusTNamedCurves.TBrainpoolP320r1Holder.Instance
+  : IX9ECParametersHolder;
+begin
+  result := TBrainpoolP320r1Holder.Create();
+end;
+
+{ TeleTrusTNamedCurves.TBrainpoolP320t1Holder }
+
+function TTeleTrusTNamedCurves.TBrainpoolP320t1Holder.CreateParameters
+  : IX9ECParameters;
+var
+  n, h: TBigInteger;
+  curve: IECCurve;
+begin
+  n := TBigInteger.Create
+    ('D35E472036BC4FB7E13C785ED201E065F98FCFA5B68F12A32D482EC7EE8658E98691555B44C59311',
+    16);
+  h := TBigInteger.Create('01', 16);
+
+  curve := ConfigureCurve
+    (TFpCurve.Create(TBigInteger.Create
+    ('D35E472036BC4FB7E13C785ED201E065F98FCFA6F6F40DEF4F92B9EC7893EC28FCD412B1F1B32E27',
+    16),
+    // q
+    TBigInteger.Create
+    ('D35E472036BC4FB7E13C785ED201E065F98FCFA6F6F40DEF4F92B9EC7893EC28FCD412B1F1B32E24',
+    16),
+    // a'
+    TBigInteger.Create
+    ('A7F561E038EB1ED560B3D147DB782013064C19F27ED27C6780AAF77FB8A547CEB5B4FEF422340353',
+    16),
+    // b'
+    n, h) as IFpCurve);
+
+  result := TX9ECParameters.Create(curve, TX9ECPoint.Create(curve,
+    THex.Decode
+    ('04925BE9FB01AFC6FB4D3E7D4990010F813408AB106C4F09CB7EE07868CC136FFF3357F624A21BED5263BA3A7A27483EBF6671DBEF7ABB30EBEE084E58A0B077AD42A5A0989D1EE71B1B9BC0455FB0D2C3')
+    ) as IX9ECPoint, // G'
+    n, h);
+end;
+
+class function TTeleTrusTNamedCurves.TBrainpoolP320t1Holder.Instance
+  : IX9ECParametersHolder;
+begin
+  result := TBrainpoolP320t1Holder.Create();
+end;
+
+{ TeleTrusTNamedCurves.TBrainpoolP384r1Holder }
+
+function TTeleTrusTNamedCurves.TBrainpoolP384r1Holder.CreateParameters
+  : IX9ECParameters;
+var
+  n, h: TBigInteger;
+  curve: IECCurve;
+begin
+  n := TBigInteger.Create
+    ('8CB91E82A3386D280F5D6F7E50E641DF152F7109ED5456B31F166E6CAC0425A7CF3AB6AF6B7FC3103B883202E9046565',
+    16);
+  h := TBigInteger.Create('01', 16);
+
+  curve := ConfigureCurve
+    (TFpCurve.Create(TBigInteger.Create
+    ('8CB91E82A3386D280F5D6F7E50E641DF152F7109ED5456B412B1DA197FB71123ACD3A729901D1A71874700133107EC53',
+    16),
+    // q
+    TBigInteger.Create
+    ('7BC382C63D8C150C3C72080ACE05AFA0C2BEA28E4FB22787139165EFBA91F90F8AA5814A503AD4EB04A8C7DD22CE2826',
+    16),
+    // a
+    TBigInteger.Create
+    ('4A8C7DD22CE28268B39B55416F0447C2FB77DE107DCD2A62E880EA53EEB62D57CB4390295DBC9943AB78696FA504C11',
+    16),
+    // b
+    n, h) as IFpCurve);
+
+  result := TX9ECParameters.Create(curve, TX9ECPoint.Create(curve,
+    THex.Decode
+    ('041D1C64F068CF45FFA2A63A81B7C13F6B8847A3E77EF14FE3DB7FCAFE0CBD10E8E826E03436D646AAEF87B2E247D4AF1E8ABE1D7520F9C2A45CB1EB8E95CFD55262B70B29FEEC5864E19C054FF99129280E4646217791811142820341263C5315')
+    ) as IX9ECPoint, // G
+    n, h);
+end;
+
+class function TTeleTrusTNamedCurves.TBrainpoolP384r1Holder.Instance
+  : IX9ECParametersHolder;
+begin
+  result := TBrainpoolP384r1Holder.Create();
+end;
+
+{ TeleTrusTNamedCurves.TBrainpoolP384t1Holder }
+
+function TTeleTrusTNamedCurves.TBrainpoolP384t1Holder.CreateParameters
+  : IX9ECParameters;
+var
+  n, h: TBigInteger;
+  curve: IECCurve;
+begin
+  n := TBigInteger.Create
+    ('8CB91E82A3386D280F5D6F7E50E641DF152F7109ED5456B31F166E6CAC0425A7CF3AB6AF6B7FC3103B883202E9046565',
+    16);
+  h := TBigInteger.Create('01', 16);
+
+  curve := ConfigureCurve
+    (TFpCurve.Create(TBigInteger.Create
+    ('8CB91E82A3386D280F5D6F7E50E641DF152F7109ED5456B412B1DA197FB71123ACD3A729901D1A71874700133107EC53',
+    16),
+    // q
+    TBigInteger.Create
+    ('8CB91E82A3386D280F5D6F7E50E641DF152F7109ED5456B412B1DA197FB71123ACD3A729901D1A71874700133107EC50',
+    16),
+    // a'
+    TBigInteger.Create
+    ('7F519EADA7BDA81BD826DBA647910F8C4B9346ED8CCDC64E4B1ABD11756DCE1D2074AA263B88805CED70355A33B471EE',
+    16),
+    // b'
+    n, h) as IFpCurve);
+
+  result := TX9ECParameters.Create(curve, TX9ECPoint.Create(curve,
+    THex.Decode
+    ('0418DE98B02DB9A306F2AFCD7235F72A819B80AB12EBD653172476FECD462AABFFC4FF191B946A5F54D8D0AA2F418808CC25AB056962D30651A114AFD2755AD336747F93475B7A1FCA3B88F2B6A208CCFE469408584DC2B2912675BF5B9E582928')
+    ) as IX9ECPoint, // G'
+    n, h);
+end;
+
+class function TTeleTrusTNamedCurves.TBrainpoolP384t1Holder.Instance
+  : IX9ECParametersHolder;
+begin
+  result := TBrainpoolP384t1Holder.Create();
+end;
+
+{ TeleTrusTNamedCurves.TBrainpoolP512r1Holder }
+
+function TTeleTrusTNamedCurves.TBrainpoolP512r1Holder.CreateParameters
+  : IX9ECParameters;
+var
+  n, h: TBigInteger;
+  curve: IECCurve;
+begin
+  n := TBigInteger.Create
+    ('AADD9DB8DBE9C48B3FD4E6AE33C9FC07CB308DB3B3C9D20ED6639CCA70330870553E5C414CA92619418661197FAC10471DB1D381085DDADDB58796829CA90069',
+    16);
+  h := TBigInteger.Create('01', 16);
+
+  curve := ConfigureCurve
+    (TFpCurve.Create(TBigInteger.Create
+    ('AADD9DB8DBE9C48B3FD4E6AE33C9FC07CB308DB3B3C9D20ED6639CCA703308717D4D9B009BC66842AECDA12AE6A380E62881FF2F2D82C68528AA6056583A48F3',
+    16),
+    // q
+    TBigInteger.Create
+    ('7830A3318B603B89E2327145AC234CC594CBDD8D3DF91610A83441CAEA9863BC2DED5D5AA8253AA10A2EF1C98B9AC8B57F1117A72BF2C7B9E7C1AC4D77FC94CA',
+    16),
+    // a
+    TBigInteger.Create
+    ('3DF91610A83441CAEA9863BC2DED5D5AA8253AA10A2EF1C98B9AC8B57F1117A72BF2C7B9E7C1AC4D77FC94CADC083E67984050B75EBAE5DD2809BD638016F723',
+    16),
+    // b
+    n, h) as IFpCurve);
+
+  result := TX9ECParameters.Create(curve, TX9ECPoint.Create(curve,
+    THex.Decode
+    ('0481AEE4BDD82ED9645A21322E9C4C6A9385ED9F70B5D916C1B43B62EEF4D0098EFF3B1F78E2D0D48D50D1687B93B97'
+    + 'D5F7C6D5047406A5E688B352209BCB9F8227DDE385D566332ECC0EABFA9CF7822FDF209F70024A57B1AA000C55B881F8111B2DCDE494A5F485E5BCA4BD88A2763AED1CA2B2FA8F0540678CD1E0F3AD80892')
+    ) as IX9ECPoint, // G
+    n, h);
+end;
+
+class function TTeleTrusTNamedCurves.TBrainpoolP512r1Holder.Instance
+  : IX9ECParametersHolder;
+begin
+  result := TBrainpoolP512r1Holder.Create();
+end;
+
+{ TeleTrusTNamedCurves.TBrainpoolP512t1Holder }
+
+function TTeleTrusTNamedCurves.TBrainpoolP512t1Holder.CreateParameters
+  : IX9ECParameters;
+var
+  n, h: TBigInteger;
+  curve: IECCurve;
+begin
+  n := TBigInteger.Create
+    ('AADD9DB8DBE9C48B3FD4E6AE33C9FC07CB308DB3B3C9D20ED6639CCA70330870553E5C414CA92619418661197FAC10471DB1D381085DDADDB58796829CA90069',
+    16);
+  h := TBigInteger.Create('01', 16);
+
+  curve := ConfigureCurve
+    (TFpCurve.Create(TBigInteger.Create
+    ('AADD9DB8DBE9C48B3FD4E6AE33C9FC07CB308DB3B3C9D20ED6639CCA703308717D4D9B009BC66842AECDA12AE6A380E62881FF2F2D82C68528AA6056583A48F3',
+    16),
+    // q
+    TBigInteger.Create
+    ('AADD9DB8DBE9C48B3FD4E6AE33C9FC07CB308DB3B3C9D20ED6639CCA703308717D4D9B009BC66842AECDA12AE6A380E62881FF2F2D82C68528AA6056583A48F0',
+    16),
+    // a'
+    TBigInteger.Create
+    ('7CBBBCF9441CFAB76E1890E46884EAE321F70C0BCB4981527897504BEC3E36A62BCDFA2304976540F6450085F2DAE145C22553B465763689180EA2571867423E',
+    16),
+    // b'
+    n, h) as IFpCurve);
+
+  result := TX9ECParameters.Create(curve, TX9ECPoint.Create(curve,
+    THex.Decode
+    ('04640ECE5C12788717B9C1BA06CBC2A6FEBA85842458C56DDE9DB1758D39C0313D82BA51735CDB3EA499AA77A7D'
+    + '6943A64F7A3F25FE26F06B51BAA2696FA9035DA5B534BD595F5AF0FA2C892376C84ACE1BB4E3019B71634C01131159CAE03CEE9D9932184BEEF216BD71DF2DADF86A627306ECFF96DBB8BACE198B61E00F8B332')
+    ) as IX9ECPoint, // G'
+    n, h);
+end;
+
+class function TTeleTrusTNamedCurves.TBrainpoolP512t1Holder.Instance
+  : IX9ECParametersHolder;
+begin
+  result := TBrainpoolP512t1Holder.Create();
+end;
+
+end.

+ 177 - 1
CryptoLib/src/Asn1/TeleTrust/ClpTeleTrusTObjectIdentifiers.pas

@@ -34,7 +34,12 @@ type
 
     FIsBooted: Boolean;
     FTeleTrusTAlgorithm, FRipeMD160, FRipeMD128, FRipeMD256, FECSign,
-      FECSignWithSha1, FECSignWithRipeMD160: IDerObjectIdentifier;
+      FECSignWithSha1, FECSignWithRipeMD160, FEccBrainpool, FEllipticCurve,
+      FVersionOne, FBrainpoolP160R1, FBrainpoolP160T1, FBrainpoolP192R1,
+      FBrainpoolP192T1, FBrainpoolP224R1, FBrainpoolP224T1, FBrainpoolP256R1,
+      FBrainpoolP256T1, FBrainpoolP320R1, FBrainpoolP320T1, FBrainpoolP384R1,
+      FBrainpoolP384T1, FBrainpoolP512R1, FBrainpoolP512T1
+      : IDerObjectIdentifier;
 
     class function GetRipeMD128: IDerObjectIdentifier; static; inline;
     class function GetRipeMD160: IDerObjectIdentifier; static; inline;
@@ -44,6 +49,24 @@ type
     class function GetECSignWithRipeMD160: IDerObjectIdentifier; static; inline;
     class function GetECSignWithSha1: IDerObjectIdentifier; static; inline;
 
+    class function GetBrainpoolP160R1: IDerObjectIdentifier; static; inline;
+    class function GetBrainpoolP160T1: IDerObjectIdentifier; static; inline;
+    class function GetBrainpoolP192R1: IDerObjectIdentifier; static; inline;
+    class function GetBrainpoolP192T1: IDerObjectIdentifier; static; inline;
+    class function GetBrainpoolP224R1: IDerObjectIdentifier; static; inline;
+    class function GetBrainpoolP224T1: IDerObjectIdentifier; static; inline;
+    class function GetBrainpoolP256R1: IDerObjectIdentifier; static; inline;
+    class function GetBrainpoolP256T1: IDerObjectIdentifier; static; inline;
+    class function GetBrainpoolP320R1: IDerObjectIdentifier; static; inline;
+    class function GetBrainpoolP320T1: IDerObjectIdentifier; static; inline;
+    class function GetBrainpoolP384R1: IDerObjectIdentifier; static; inline;
+    class function GetBrainpoolP384T1: IDerObjectIdentifier; static; inline;
+    class function GetBrainpoolP512R1: IDerObjectIdentifier; static; inline;
+    class function GetBrainpoolP512T1: IDerObjectIdentifier; static; inline;
+    class function GetEccBrainpool: IDerObjectIdentifier; static; inline;
+    class function GetEllipticCurve: IDerObjectIdentifier; static; inline;
+    class function GetVersionOne: IDerObjectIdentifier; static; inline;
+
     class constructor TeleTrusTObjectIdentifiers();
 
   public
@@ -58,6 +81,38 @@ type
     class property ECSignWithRipeMD160: IDerObjectIdentifier
       read GetECSignWithRipeMD160;
 
+    class property EccBrainpool: IDerObjectIdentifier read GetEccBrainpool;
+    class property EllipticCurve: IDerObjectIdentifier read GetEllipticCurve;
+    class property VersionOne: IDerObjectIdentifier read GetVersionOne;
+    class property BrainpoolP160R1: IDerObjectIdentifier
+      read GetBrainpoolP160R1;
+    class property BrainpoolP160T1: IDerObjectIdentifier
+      read GetBrainpoolP160T1;
+    class property BrainpoolP192R1: IDerObjectIdentifier
+      read GetBrainpoolP192R1;
+    class property BrainpoolP192T1: IDerObjectIdentifier
+      read GetBrainpoolP192T1;
+    class property BrainpoolP224R1: IDerObjectIdentifier
+      read GetBrainpoolP224R1;
+    class property BrainpoolP224T1: IDerObjectIdentifier
+      read GetBrainpoolP224T1;
+    class property BrainpoolP256R1: IDerObjectIdentifier
+      read GetBrainpoolP256R1;
+    class property BrainpoolP256T1: IDerObjectIdentifier
+      read GetBrainpoolP256T1;
+    class property BrainpoolP320R1: IDerObjectIdentifier
+      read GetBrainpoolP320R1;
+    class property BrainpoolP320T1: IDerObjectIdentifier
+      read GetBrainpoolP320T1;
+    class property BrainpoolP384R1: IDerObjectIdentifier
+      read GetBrainpoolP384R1;
+    class property BrainpoolP384T1: IDerObjectIdentifier
+      read GetBrainpoolP384T1;
+    class property BrainpoolP512R1: IDerObjectIdentifier
+      read GetBrainpoolP512R1;
+    class property BrainpoolP512T1: IDerObjectIdentifier
+      read GetBrainpoolP512T1;
+
     class procedure Boot(); static;
 
   end;
@@ -104,6 +159,107 @@ begin
   result := FRipeMD256;
 end;
 
+class function TTeleTrusTObjectIdentifiers.GetEccBrainpool
+  : IDerObjectIdentifier;
+begin
+  result := FEccBrainpool;
+end;
+
+class function TTeleTrusTObjectIdentifiers.GetVersionOne: IDerObjectIdentifier;
+begin
+  result := FVersionOne;
+end;
+
+class function TTeleTrusTObjectIdentifiers.GetEllipticCurve
+  : IDerObjectIdentifier;
+begin
+  result := FEllipticCurve;
+end;
+
+class function TTeleTrusTObjectIdentifiers.GetBrainpoolP160R1
+  : IDerObjectIdentifier;
+begin
+  result := FBrainpoolP160R1;
+end;
+
+class function TTeleTrusTObjectIdentifiers.GetBrainpoolP160T1
+  : IDerObjectIdentifier;
+begin
+  result := FBrainpoolP160T1;
+end;
+
+class function TTeleTrusTObjectIdentifiers.GetBrainpoolP192R1
+  : IDerObjectIdentifier;
+begin
+  result := FBrainpoolP192R1;
+end;
+
+class function TTeleTrusTObjectIdentifiers.GetBrainpoolP192T1
+  : IDerObjectIdentifier;
+begin
+  result := FBrainpoolP192T1;
+end;
+
+class function TTeleTrusTObjectIdentifiers.GetBrainpoolP224R1
+  : IDerObjectIdentifier;
+begin
+  result := FBrainpoolP224R1;
+end;
+
+class function TTeleTrusTObjectIdentifiers.GetBrainpoolP224T1
+  : IDerObjectIdentifier;
+begin
+  result := FBrainpoolP224T1;
+end;
+
+class function TTeleTrusTObjectIdentifiers.GetBrainpoolP256R1
+  : IDerObjectIdentifier;
+begin
+  result := FBrainpoolP256R1;
+end;
+
+class function TTeleTrusTObjectIdentifiers.GetBrainpoolP256T1
+  : IDerObjectIdentifier;
+begin
+  result := FBrainpoolP256T1;
+end;
+
+class function TTeleTrusTObjectIdentifiers.GetBrainpoolP320R1
+  : IDerObjectIdentifier;
+begin
+  result := FBrainpoolP320R1;
+end;
+
+class function TTeleTrusTObjectIdentifiers.GetBrainpoolP320T1
+  : IDerObjectIdentifier;
+begin
+  result := FBrainpoolP320T1;
+end;
+
+class function TTeleTrusTObjectIdentifiers.GetBrainpoolP384R1
+  : IDerObjectIdentifier;
+begin
+  result := FBrainpoolP384R1;
+end;
+
+class function TTeleTrusTObjectIdentifiers.GetBrainpoolP384T1
+  : IDerObjectIdentifier;
+begin
+  result := FBrainpoolP384T1;
+end;
+
+class function TTeleTrusTObjectIdentifiers.GetBrainpoolP512R1
+  : IDerObjectIdentifier;
+begin
+  result := FBrainpoolP512R1;
+end;
+
+class function TTeleTrusTObjectIdentifiers.GetBrainpoolP512T1
+  : IDerObjectIdentifier;
+begin
+  result := FBrainpoolP512T1;
+end;
+
 class procedure TTeleTrusTObjectIdentifiers.Boot;
 begin
   if not FIsBooted then
@@ -118,6 +274,26 @@ begin
     FECSignWithSha1 := TDerObjectIdentifier.Create(ECSign.ID + '.1');
     FECSignWithRipeMD160 := TDerObjectIdentifier.Create(ECSign.ID + '.2');
 
+    FEccBrainpool := TDerObjectIdentifier.Create(TeleTrusTAlgorithm.ID +
+      '.3.2.8');
+    FEllipticCurve := TDerObjectIdentifier.Create(EccBrainpool.ID + '.1');
+    FVersionOne := TDerObjectIdentifier.Create(EllipticCurve.ID + '.1');
+
+    FBrainpoolP160R1 := TDerObjectIdentifier.Create(VersionOne.ID + '.1');
+    FBrainpoolP160T1 := TDerObjectIdentifier.Create(VersionOne.ID + '.2');
+    FBrainpoolP192R1 := TDerObjectIdentifier.Create(VersionOne.ID + '.3');
+    FBrainpoolP192T1 := TDerObjectIdentifier.Create(VersionOne.ID + '.4');
+    FBrainpoolP224R1 := TDerObjectIdentifier.Create(VersionOne.ID + '.5');
+    FBrainpoolP224T1 := TDerObjectIdentifier.Create(VersionOne.ID + '.6');
+    FBrainpoolP256R1 := TDerObjectIdentifier.Create(VersionOne.ID + '.7');
+    FBrainpoolP256T1 := TDerObjectIdentifier.Create(VersionOne.ID + '.8');
+    FBrainpoolP320R1 := TDerObjectIdentifier.Create(VersionOne.ID + '.9');
+    FBrainpoolP320T1 := TDerObjectIdentifier.Create(VersionOne.ID + '.10');
+    FBrainpoolP384R1 := TDerObjectIdentifier.Create(VersionOne.ID + '.11');
+    FBrainpoolP384T1 := TDerObjectIdentifier.Create(VersionOne.ID + '.12');
+    FBrainpoolP512R1 := TDerObjectIdentifier.Create(VersionOne.ID + '.13');
+    FBrainpoolP512T1 := TDerObjectIdentifier.Create(VersionOne.ID + '.14');
+
     FIsBooted := True;
   end;
 

+ 17 - 49
CryptoLib/src/Asn1/X9/ClpECNamedCurveTable.pas

@@ -24,12 +24,9 @@ interface
 uses
   Generics.Collections,
   ClpCryptoLibTypes,
-  // ClpX962NamedCurves,
-  // ClpECGost3410NamedCurves,
-  // ClpX9ECParameters,
   ClpSecNamedCurves,
   ClpNistNamedCurves,
-  // ClpIECDomainParameters,
+  ClpTeleTrusTNamedCurves,
   ClpIAsn1Objects,
   ClpIX9ECParameters;
 
@@ -42,8 +39,6 @@ type
   strict private
 
     class function GetNames: TCryptoLibStringArray; static;
-    // class function FromDomainParameters(const dp: IECDomainParameters)
-    // : IX9ECParameters; static; inline;
 
   public
     // /**
@@ -55,7 +50,6 @@ type
     // */
     class function GetByName(const name: String): IX9ECParameters; static;
 
-    class function GetName(const oid: IDerObjectIdentifier): String; static;
     // /**
     // * return the object identifier signified by the passed in name. Null
     // * if there is no object identifier associated with name.
@@ -88,36 +82,23 @@ implementation
 
 { TECNamedCurveTable }
 
-// class function TECNamedCurveTable.FromDomainParameters
-// (const dp: IECDomainParameters): IX9ECParameters;
-// begin
-// if dp = Nil then
-// begin
-// result := Nil;
-// end
-// else
-// begin
-// result := TX9ECParameters.Create(dp.Curve, dp.G, dp.N, dp.H, dp.GetSeed())
-// end;
-//
-// end;
-
 class function TECNamedCurveTable.GetByName(const name: String)
   : IX9ECParameters;
 var
   ecP: IX9ECParameters;
 begin
-  // ecP := TX962NamedCurves.GetByName(name);
-  // if (ecP = Nil) then
-  // begin
   ecP := TSecNamedCurves.GetByName(name);
-  // end;
 
   if (ecP = Nil) then
   begin
     ecP := TNistNamedCurves.GetByName(name);
   end;
 
+  if (ecP = Nil) then
+  begin
+    ecP := TTeleTrusTNamedCurves.GetByName(name);
+  end;
+
   result := ecP;
 end;
 
@@ -126,31 +107,15 @@ class function TECNamedCurveTable.GetByOid(const oid: IDerObjectIdentifier)
 var
   ecP: IX9ECParameters;
 begin
-  // ecP := TX962NamedCurves.GetByOid(oid);
-  // if (ecP = Nil) then
-  // begin
   ecP := TSecNamedCurves.GetByOid(oid);
-  // end;
   // NOTE: All the NIST curves are currently from SEC, so no point in redundant OID lookup
-  result := ecP;
-end;
-
-class function TECNamedCurveTable.GetName
-  (const oid: IDerObjectIdentifier): String;
-var
-  name: String;
-begin
-  // name := TX962NamedCurves.GetName(oid);
-  // if (name = '') then
-  // begin
-  name := TSecNamedCurves.GetName(oid);
-  // end;
 
-  if (name = '') then
+  if (ecP = Nil) then
   begin
-    name := TNistNamedCurves.GetName(oid);
+    ecP := TTeleTrusTNamedCurves.GetByOid(oid);
   end;
-  result := name;
+
+  result := ecP;
 end;
 
 class function TECNamedCurveTable.GetOid(const name: String)
@@ -158,17 +123,19 @@ class function TECNamedCurveTable.GetOid(const name: String)
 var
   oid: IDerObjectIdentifier;
 begin
-  // oid := TX962NamedCurves.GetOid(name);
-  // if (oid = Nil) then
-  // begin
+
   oid := TSecNamedCurves.GetOid(name);
-  // end;
 
   if (oid = Nil) then
   begin
     oid := TNistNamedCurves.GetOid(name);
   end;
 
+  if (oid = Nil) then
+  begin
+    oid := TTeleTrusTNamedCurves.GetOid(name);
+  end;
+
   result := oid;
 end;
 
@@ -180,6 +147,7 @@ begin
   try
     temp.AddRange(TSecNamedCurves.Names);
     temp.AddRange(TNistNamedCurves.Names);
+    temp.AddRange(TTeleTrusTNamedCurves.Names);
     result := temp.ToArray;
   finally
     temp.Free;

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

@@ -365,6 +365,8 @@ contains
   ClpIECKeyPairGenerator in '..\..\Interfaces\ClpIECKeyPairGenerator.pas',
   ClpIExtensionField in '..\..\Interfaces\ClpIExtensionField.pas',
   ClpOidTokenizer in '..\..\Asn1\ClpOidTokenizer.pas',
-  ClpValidityPrecompInfo in '..\..\Math\EC\Multiplier\ClpValidityPrecompInfo.pas';
+  ClpValidityPrecompInfo in '..\..\Math\EC\Multiplier\ClpValidityPrecompInfo.pas',
+  ClpTeleTrusTNamedCurves in '..\..\Asn1\TeleTrust\ClpTeleTrusTNamedCurves.pas',
+  ClpAgreementUtilities in '..\..\Security\ClpAgreementUtilities.pas';
 
 end.

+ 243 - 239
CryptoLib/src/Packages/FPC/CryptoLib4PascalPackage.lpk

@@ -25,7 +25,7 @@
  Acknowledgements: 
 Thanks to Sphere 10 Software (http://www.sphere10.com/) for sponsoring the development of this library "/>
     <Version Major="3" Minor="1"/>
-    <Files Count="334">
+    <Files Count="335">
       <Item1>
         <Filename Value="..\..\Asn1\ClpOidTokenizer.pas"/>
         <UnitName Value="ClpOidTokenizer"/>
@@ -888,482 +888,486 @@ Thanks to Sphere 10 Software (http://www.sphere10.com/) for sponsoring the devel
         <UnitName Value="ClpIDsaParameterGenerationParameters"/>
       </Item215>
       <Item216>
-        <Filename Value="..\..\Math\EC\ClpValidityPrecompInfo.pas"/>
-        <UnitName Value="ClpValidityPrecompInfo"/>
-      </Item216>
-      <Item217>
         <Filename Value="..\..\Interfaces\ClpIValidityPrecompInfo.pas"/>
         <UnitName Value="ClpIValidityPrecompInfo"/>
-      </Item217>
-      <Item218>
+      </Item216>
+      <Item217>
         <Filename Value="..\..\Crypto\Generators\ClpDsaParametersGenerator.pas"/>
         <UnitName Value="ClpDsaParametersGenerator"/>
-      </Item218>
-      <Item219>
+      </Item217>
+      <Item218>
         <Filename Value="..\..\Asn1\X509\ClpDsaParameter.pas"/>
         <UnitName Value="ClpDsaParameter"/>
-      </Item219>
-      <Item220>
+      </Item218>
+      <Item219>
         <Filename Value="..\..\Interfaces\ClpIDsaParameter.pas"/>
         <UnitName Value="ClpIDsaParameter"/>
-      </Item220>
-      <Item221>
+      </Item219>
+      <Item220>
         <Filename Value="..\..\Interfaces\ClpIKeyEncoder.pas"/>
         <UnitName Value="ClpIKeyEncoder"/>
-      </Item221>
-      <Item222>
+      </Item220>
+      <Item221>
         <Filename Value="..\..\Interfaces\ClpIDsaParametersGenerator.pas"/>
         <UnitName Value="ClpIDsaParametersGenerator"/>
-      </Item222>
-      <Item223>
+      </Item221>
+      <Item222>
         <Filename Value="..\..\Interfaces\ClpIPreCompCallBack.pas"/>
         <UnitName Value="ClpIPreCompCallBack"/>
-      </Item223>
-      <Item224>
+      </Item222>
+      <Item223>
         <Filename Value="..\..\Math\EC\Multiplier\ClpValidityPrecompInfo.pas"/>
         <AddToUsesPkgSection Value="False"/>
         <UnitName Value="ClpValidityPrecompInfo"/>
-      </Item224>
-      <Item225>
+      </Item223>
+      <Item224>
         <Filename Value="..\..\Asn1\Nist\ClpNistNamedCurves.pas"/>
         <UnitName Value="ClpNistNamedCurves"/>
-      </Item225>
-      <Item226>
+      </Item224>
+      <Item225>
         <Filename Value="..\..\Math\Raw\ClpNat256.pas"/>
         <UnitName Value="ClpNat256"/>
-      </Item226>
-      <Item227>
+      </Item225>
+      <Item226>
         <Filename Value="..\..\Math\Raw\ClpNat320.pas"/>
         <UnitName Value="ClpNat320"/>
-      </Item227>
-      <Item228>
+      </Item226>
+      <Item227>
         <Filename Value="..\..\Crypto\Engines\ClpAesLightEngine.pas"/>
         <UnitName Value="ClpAesLightEngine"/>
-      </Item228>
-      <Item229>
+      </Item227>
+      <Item228>
         <Filename Value="..\..\Interfaces\ClpIAesLightEngine.pas"/>
         <UnitName Value="ClpIAesLightEngine"/>
-      </Item229>
-      <Item230>
+      </Item228>
+      <Item229>
         <Filename Value="..\..\Crypto\EC\ClpCustomNamedCurves.pas"/>
         <UnitName Value="ClpCustomNamedCurves"/>
-      </Item230>
-      <Item231>
+      </Item229>
+      <Item230>
         <Filename Value="..\..\Math\Raw\ClpNat384.pas"/>
         <UnitName Value="ClpNat384"/>
-      </Item231>
-      <Item232>
+      </Item230>
+      <Item231>
         <Filename Value="..\..\Math\Raw\ClpNat192.pas"/>
         <UnitName Value="ClpNat192"/>
-      </Item232>
-      <Item233>
+      </Item231>
+      <Item232>
         <Filename Value="..\..\Math\Raw\ClpNat512.pas"/>
         <UnitName Value="ClpNat512"/>
-      </Item233>
-      <Item234>
+      </Item232>
+      <Item233>
         <Filename Value="..\..\Math\Raw\ClpInterleave.pas"/>
         <UnitName Value="ClpInterleave"/>
-      </Item234>
-      <Item235>
+      </Item233>
+      <Item234>
         <Filename Value="..\..\Asn1\Bsi\ClpBsiObjectIdentifiers.pas"/>
         <UnitName Value="ClpBsiObjectIdentifiers"/>
-      </Item235>
-      <Item236>
+      </Item234>
+      <Item235>
         <Filename Value="..\..\Asn1\Eac\ClpEacObjectIdentifiers.pas"/>
         <UnitName Value="ClpEacObjectIdentifiers"/>
-      </Item236>
-      <Item237>
+      </Item235>
+      <Item236>
         <Filename Value="..\..\Interfaces\ClpIDsaExt.pas"/>
         <UnitName Value="ClpIDsaExt"/>
-      </Item237>
-      <Item238>
+      </Item236>
+      <Item237>
         <Filename Value="..\..\Interfaces\ClpISchnorrDigestSigner.pas"/>
         <UnitName Value="ClpISchnorrDigestSigner"/>
-      </Item238>
-      <Item239>
+      </Item237>
+      <Item238>
         <Filename Value="..\..\Interfaces\ClpIECSchnorrSipaSigner.pas"/>
         <UnitName Value="ClpIECSchnorrSipaSigner"/>
-      </Item239>
-      <Item240>
+      </Item238>
+      <Item239>
         <Filename Value="..\..\Crypto\Signers\ClpECSchnorrSipaSigner.pas"/>
         <UnitName Value="ClpECSchnorrSipaSigner"/>
-      </Item240>
-      <Item241>
+      </Item239>
+      <Item240>
         <Filename Value="..\..\Crypto\Signers\ClpSchnorrDigestSigner.pas"/>
         <UnitName Value="ClpSchnorrDigestSigner"/>
-      </Item241>
-      <Item242>
+      </Item240>
+      <Item241>
         <Filename Value="..\..\Interfaces\ClpISchnorr.pas"/>
         <UnitName Value="ClpISchnorr"/>
-      </Item242>
-      <Item243>
+      </Item241>
+      <Item242>
         <Filename Value="..\..\Interfaces\ClpISchnorrExt.pas"/>
         <UnitName Value="ClpISchnorrExt"/>
-      </Item243>
-      <Item244>
+      </Item242>
+      <Item243>
         <Filename Value="..\..\Crypto\Engines\ClpBlowfishEngine.pas"/>
         <UnitName Value="ClpBlowfishEngine"/>
-      </Item244>
-      <Item245>
+      </Item243>
+      <Item244>
         <Filename Value="..\..\Interfaces\ClpIBlowfishEngine.pas"/>
         <UnitName Value="ClpIBlowfishEngine"/>
-      </Item245>
-      <Item246>
+      </Item244>
+      <Item245>
         <Filename Value="..\..\Math\EC\ClpECC.pas"/>
         <UnitName Value="ClpECC"/>
-      </Item246>
-      <Item247>
+      </Item245>
+      <Item246>
         <Filename Value="..\..\Asn1\ClpAsn1Objects.pas"/>
         <UnitName Value="ClpAsn1Objects"/>
-      </Item247>
-      <Item248>
+      </Item246>
+      <Item247>
         <Filename Value="..\..\Crypto\Signers\SignersEncodings\ClpSignersEncodings.pas"/>
         <UnitName Value="ClpSignersEncodings"/>
-      </Item248>
-      <Item249>
+      </Item247>
+      <Item248>
         <Filename Value="..\..\Interfaces\ClpISignersEncodings.pas"/>
         <UnitName Value="ClpISignersEncodings"/>
-      </Item249>
-      <Item250>
+      </Item248>
+      <Item249>
         <Filename Value="..\..\Utils\Encoders\ClpEncoders.pas"/>
         <UnitName Value="ClpEncoders"/>
-      </Item250>
-      <Item251>
+      </Item249>
+      <Item250>
         <Filename Value="..\..\Math\EC\Custom\Sec\ClpSecT283Custom.pas"/>
         <UnitName Value="ClpSecT283Custom"/>
-      </Item251>
-      <Item252>
+      </Item250>
+      <Item251>
         <Filename Value="..\..\Math\EC\Custom\Sec\ClpSecP521R1Custom.pas"/>
         <UnitName Value="ClpSecP521R1Custom"/>
-      </Item252>
-      <Item253>
+      </Item251>
+      <Item252>
         <Filename Value="..\..\Math\EC\Custom\Sec\ClpSecP384R1Custom.pas"/>
         <UnitName Value="ClpSecP384R1Custom"/>
-      </Item253>
-      <Item254>
+      </Item252>
+      <Item253>
         <Filename Value="..\..\Math\EC\Custom\Sec\ClpSecP256R1Custom.pas"/>
         <UnitName Value="ClpSecP256R1Custom"/>
-      </Item254>
-      <Item255>
+      </Item253>
+      <Item254>
         <Filename Value="..\..\Math\EC\Custom\Sec\ClpSecP256K1Custom.pas"/>
         <UnitName Value="ClpSecP256K1Custom"/>
-      </Item255>
-      <Item256>
+      </Item254>
+      <Item255>
         <Filename Value="..\..\Interfaces\ClpIX9ECC.pas"/>
         <UnitName Value="ClpIX9ECC"/>
-      </Item256>
-      <Item257>
+      </Item255>
+      <Item256>
         <Filename Value="..\..\Asn1\X9\ClpX9ECC.pas"/>
         <UnitName Value="ClpX9ECC"/>
-      </Item257>
-      <Item258>
+      </Item256>
+      <Item257>
         <Filename Value="..\..\Interfaces\ClpIAsn1Objects.pas"/>
         <UnitName Value="ClpIAsn1Objects"/>
-      </Item258>
-      <Item259>
+      </Item257>
+      <Item258>
         <Filename Value="..\..\Crypto\Modes\ClpBlockCipherModes.pas"/>
         <UnitName Value="ClpBlockCipherModes"/>
-      </Item259>
-      <Item260>
+      </Item258>
+      <Item259>
         <Filename Value="..\..\Math\EC\ClpECCurveConstants.pas"/>
         <UnitName Value="ClpECCurveConstants"/>
-      </Item260>
-      <Item261>
+      </Item259>
+      <Item260>
         <Filename Value="..\..\Interfaces\ClpIBlockCipherModes.pas"/>
         <UnitName Value="ClpIBlockCipherModes"/>
-      </Item261>
-      <Item262>
+      </Item260>
+      <Item261>
         <Filename Value="..\..\Interfaces\ClpIPaddingModes.pas"/>
         <UnitName Value="ClpIPaddingModes"/>
-      </Item262>
-      <Item263>
+      </Item261>
+      <Item262>
         <Filename Value="..\..\Interfaces\ClpISecP256K1Custom.pas"/>
         <UnitName Value="ClpISecP256K1Custom"/>
-      </Item263>
-      <Item264>
+      </Item262>
+      <Item263>
         <Filename Value="..\..\Interfaces\ClpISecP256R1Custom.pas"/>
         <UnitName Value="ClpISecP256R1Custom"/>
-      </Item264>
-      <Item265>
+      </Item263>
+      <Item264>
         <Filename Value="..\..\Interfaces\ClpISecP384R1Custom.pas"/>
         <UnitName Value="ClpISecP384R1Custom"/>
-      </Item265>
-      <Item266>
+      </Item264>
+      <Item265>
         <Filename Value="..\..\Interfaces\ClpISecP521R1Custom.pas"/>
         <UnitName Value="ClpISecP521R1Custom"/>
-      </Item266>
-      <Item267>
+      </Item265>
+      <Item266>
         <Filename Value="..\..\Interfaces\ClpISecT283Custom.pas"/>
         <UnitName Value="ClpISecT283Custom"/>
-      </Item267>
-      <Item268>
+      </Item266>
+      <Item267>
         <Filename Value="..\..\Crypto\Paddings\ClpPaddingModes.pas"/>
         <UnitName Value="ClpPaddingModes"/>
-      </Item268>
-      <Item269>
+      </Item267>
+      <Item268>
         <Filename Value="..\..\Interfaces\ClpIECC.pas"/>
         <UnitName Value="ClpIECC"/>
-      </Item269>
-      <Item270>
+      </Item268>
+      <Item269>
         <Filename Value="..\..\Interfaces\ClpISpeckEngine.pas"/>
         <UnitName Value="ClpISpeckEngine"/>
-      </Item270>
-      <Item271>
+      </Item269>
+      <Item270>
         <Filename Value="..\..\Crypto\Engines\ClpSpeckEngine.pas"/>
         <UnitName Value="ClpSpeckEngine"/>
-      </Item271>
-      <Item272>
+      </Item270>
+      <Item271>
         <Filename Value="..\..\Interfaces\ClpIBufferedStreamCipher.pas"/>
         <UnitName Value="ClpIBufferedStreamCipher"/>
-      </Item272>
-      <Item273>
+      </Item271>
+      <Item272>
         <Filename Value="..\..\Interfaces\ClpIChaChaEngine.pas"/>
         <UnitName Value="ClpIChaChaEngine"/>
-      </Item273>
-      <Item274>
+      </Item272>
+      <Item273>
         <Filename Value="..\..\Interfaces\ClpIXSalsa20Engine.pas"/>
         <UnitName Value="ClpIXSalsa20Engine"/>
-      </Item274>
-      <Item275>
+      </Item273>
+      <Item274>
         <Filename Value="..\..\Interfaces\ClpISalsa20Engine.pas"/>
         <UnitName Value="ClpISalsa20Engine"/>
-      </Item275>
-      <Item276>
+      </Item274>
+      <Item275>
         <Filename Value="..\..\Crypto\ClpBufferedStreamCipher.pas"/>
         <UnitName Value="ClpBufferedStreamCipher"/>
-      </Item276>
-      <Item277>
+      </Item275>
+      <Item276>
         <Filename Value="..\..\Crypto\Engines\ClpSalsa20Engine.pas"/>
         <UnitName Value="ClpSalsa20Engine"/>
-      </Item277>
-      <Item278>
+      </Item276>
+      <Item277>
         <Filename Value="..\..\Crypto\Engines\ClpXSalsa20Engine.pas"/>
         <UnitName Value="ClpXSalsa20Engine"/>
-      </Item278>
-      <Item279>
+      </Item277>
+      <Item278>
         <Filename Value="..\..\Crypto\Engines\ClpChaChaEngine.pas"/>
         <UnitName Value="ClpChaChaEngine"/>
-      </Item279>
-      <Item280>
+      </Item278>
+      <Item279>
         <Filename Value="..\..\Interfaces\ClpIRijndaelEngine.pas"/>
         <UnitName Value="ClpIRijndaelEngine"/>
-      </Item280>
-      <Item281>
+      </Item279>
+      <Item280>
         <Filename Value="..\..\Crypto\Engines\ClpRijndaelEngine.pas"/>
         <UnitName Value="ClpRijndaelEngine"/>
-      </Item281>
-      <Item282>
+      </Item280>
+      <Item281>
         <Filename Value="..\..\Interfaces\ClpIIESParameterSpec.pas"/>
         <UnitName Value="ClpIIESParameterSpec"/>
-      </Item282>
-      <Item283>
+      </Item281>
+      <Item282>
         <Filename Value="..\..\Interfaces\ClpIAlgorithmParameterSpec.pas"/>
         <UnitName Value="ClpIAlgorithmParameterSpec"/>
-      </Item283>
-      <Item284>
+      </Item282>
+      <Item283>
         <Filename Value="..\..\Crypto\Parameters\ClpIESParameterSpec.pas"/>
         <UnitName Value="ClpIESParameterSpec"/>
-      </Item284>
-      <Item285>
+      </Item283>
+      <Item284>
         <Filename Value="..\..\Math\EC\Custom\Djb\ClpCurve25519Custom.pas"/>
         <UnitName Value="ClpCurve25519Custom"/>
-      </Item285>
-      <Item286>
+      </Item284>
+      <Item285>
         <Filename Value="..\..\Interfaces\ClpICurve25519Custom.pas"/>
         <UnitName Value="ClpICurve25519Custom"/>
-      </Item286>
-      <Item287>
+      </Item285>
+      <Item286>
         <Filename Value="..\..\Crypto\Engines\ClpSpeckLegacyEngine.pas"/>
         <UnitName Value="ClpSpeckLegacyEngine"/>
-      </Item287>
-      <Item288>
+      </Item286>
+      <Item287>
         <Filename Value="..\..\Interfaces\ClpISpeckLegacyEngine.pas"/>
         <UnitName Value="ClpISpeckLegacyEngine"/>
-      </Item288>
-      <Item289>
+      </Item287>
+      <Item288>
         <Filename Value="..\..\Interfaces\ClpIEd25519.pas"/>
         <UnitName Value="ClpIEd25519"/>
-      </Item289>
-      <Item290>
+      </Item288>
+      <Item289>
         <Filename Value="..\..\Interfaces\ClpIEd25519Blake2B.pas"/>
         <UnitName Value="ClpIEd25519Blake2B"/>
-      </Item290>
-      <Item291>
+      </Item289>
+      <Item290>
         <Filename Value="..\..\Math\EC\Rfc7748\ClpX25519Field.pas"/>
         <UnitName Value="ClpX25519Field"/>
-      </Item291>
-      <Item292>
+      </Item290>
+      <Item291>
         <Filename Value="..\..\Math\EC\Rfc8032\ClpEd25519.pas"/>
         <UnitName Value="ClpEd25519"/>
-      </Item292>
-      <Item293>
+      </Item291>
+      <Item292>
         <Filename Value="..\..\Math\EC\Rfc8032\ClpEd25519Blake2B.pas"/>
         <UnitName Value="ClpEd25519Blake2B"/>
-      </Item293>
-      <Item294>
+      </Item292>
+      <Item293>
         <Filename Value="..\..\Math\EC\Rfc7748\ClpX25519.pas"/>
         <UnitName Value="ClpX25519"/>
-      </Item294>
-      <Item295>
+      </Item293>
+      <Item294>
         <Filename Value="..\..\Asn1\Edec\ClpEdECObjectIdentifiers.pas"/>
         <UnitName Value="ClpEdECObjectIdentifiers"/>
-      </Item295>
-      <Item296>
+      </Item294>
+      <Item295>
         <Filename Value="..\..\Interfaces\ClpIEd25519CtxBlake2BSigner.pas"/>
         <UnitName Value="ClpIEd25519CtxBlake2BSigner"/>
-      </Item296>
-      <Item297>
+      </Item295>
+      <Item296>
         <Filename Value="..\..\Interfaces\ClpIEd25519PhBlake2BSigner.pas"/>
         <UnitName Value="ClpIEd25519PhBlake2BSigner"/>
-      </Item297>
-      <Item298>
+      </Item296>
+      <Item297>
         <Filename Value="..\..\Interfaces\ClpIEd25519PhSigner.pas"/>
         <UnitName Value="ClpIEd25519PhSigner"/>
-      </Item298>
-      <Item299>
+      </Item297>
+      <Item298>
         <Filename Value="..\..\Interfaces\ClpIEd25519CtxSigner.pas"/>
         <UnitName Value="ClpIEd25519CtxSigner"/>
-      </Item299>
-      <Item300>
+      </Item298>
+      <Item299>
         <Filename Value="..\..\Interfaces\ClpIEd25519Blake2BSigner.pas"/>
         <UnitName Value="ClpIEd25519Blake2BSigner"/>
-      </Item300>
-      <Item301>
+      </Item299>
+      <Item300>
         <Filename Value="..\..\Interfaces\ClpIEd25519Signer.pas"/>
         <UnitName Value="ClpIEd25519Signer"/>
-      </Item301>
-      <Item302>
+      </Item300>
+      <Item301>
         <Filename Value="..\..\Interfaces\ClpIEd25519Blake2BKeyGenerationParameters.pas"/>
         <UnitName Value="ClpIEd25519Blake2BKeyGenerationParameters"/>
-      </Item302>
-      <Item303>
+      </Item301>
+      <Item302>
         <Filename Value="..\..\Interfaces\ClpIEd25519KeyGenerationParameters.pas"/>
         <UnitName Value="ClpIEd25519KeyGenerationParameters"/>
-      </Item303>
-      <Item304>
+      </Item302>
+      <Item303>
         <Filename Value="..\..\Interfaces\ClpIX25519KeyGenerationParameters.pas"/>
         <UnitName Value="ClpIX25519KeyGenerationParameters"/>
-      </Item304>
-      <Item305>
+      </Item303>
+      <Item304>
         <Filename Value="..\..\Interfaces\ClpIEd25519Blake2BKeyPairGenerator.pas"/>
         <UnitName Value="ClpIEd25519Blake2BKeyPairGenerator"/>
-      </Item305>
-      <Item306>
+      </Item304>
+      <Item305>
         <Filename Value="..\..\Interfaces\ClpIEd25519KeyPairGenerator.pas"/>
         <UnitName Value="ClpIEd25519KeyPairGenerator"/>
-      </Item306>
-      <Item307>
+      </Item305>
+      <Item306>
         <Filename Value="..\..\Interfaces\ClpIX25519KeyPairGenerator.pas"/>
         <UnitName Value="ClpIX25519KeyPairGenerator"/>
-      </Item307>
-      <Item308>
+      </Item306>
+      <Item307>
         <Filename Value="..\..\Interfaces\ClpIEd25519Blake2BPrivateKeyParameters.pas"/>
         <UnitName Value="ClpIEd25519Blake2BPrivateKeyParameters"/>
-      </Item308>
-      <Item309>
+      </Item307>
+      <Item308>
         <Filename Value="..\..\Interfaces\ClpIEd25519Blake2BPublicKeyParameters.pas"/>
         <UnitName Value="ClpIEd25519Blake2BPublicKeyParameters"/>
-      </Item309>
-      <Item310>
+      </Item308>
+      <Item309>
         <Filename Value="..\..\Interfaces\ClpIEd25519PrivateKeyParameters.pas"/>
         <UnitName Value="ClpIEd25519PrivateKeyParameters"/>
-      </Item310>
-      <Item311>
+      </Item309>
+      <Item310>
         <Filename Value="..\..\Interfaces\ClpIEd25519PublicKeyParameters.pas"/>
         <UnitName Value="ClpIEd25519PublicKeyParameters"/>
-      </Item311>
-      <Item312>
+      </Item310>
+      <Item311>
         <Filename Value="..\..\Interfaces\ClpIX25519PublicKeyParameters.pas"/>
         <UnitName Value="ClpIX25519PublicKeyParameters"/>
-      </Item312>
-      <Item313>
+      </Item311>
+      <Item312>
         <Filename Value="..\..\Interfaces\ClpIX25519PrivateKeyParameters.pas"/>
         <UnitName Value="ClpIX25519PrivateKeyParameters"/>
-      </Item313>
-      <Item314>
+      </Item312>
+      <Item313>
         <Filename Value="..\..\Interfaces\ClpIX25519Agreement.pas"/>
         <UnitName Value="ClpIX25519Agreement"/>
-      </Item314>
-      <Item315>
+      </Item313>
+      <Item314>
         <Filename Value="..\..\Interfaces\ClpIRawAgreement.pas"/>
         <UnitName Value="ClpIRawAgreement"/>
-      </Item315>
-      <Item316>
+      </Item314>
+      <Item315>
         <Filename Value="..\..\Crypto\Agreement\ClpX25519Agreement.pas"/>
         <UnitName Value="ClpX25519Agreement"/>
-      </Item316>
-      <Item317>
+      </Item315>
+      <Item316>
         <Filename Value="..\..\Crypto\Parameters\ClpEd25519Blake2BKeyGenerationParameters.pas"/>
         <UnitName Value="ClpEd25519Blake2BKeyGenerationParameters"/>
-      </Item317>
-      <Item318>
+      </Item316>
+      <Item317>
         <Filename Value="..\..\Crypto\Parameters\ClpEd25519KeyGenerationParameters.pas"/>
         <UnitName Value="ClpEd25519KeyGenerationParameters"/>
-      </Item318>
-      <Item319>
+      </Item317>
+      <Item318>
         <Filename Value="..\..\Crypto\Parameters\ClpX25519KeyGenerationParameters.pas"/>
         <UnitName Value="ClpX25519KeyGenerationParameters"/>
-      </Item319>
-      <Item320>
+      </Item318>
+      <Item319>
         <Filename Value="..\..\Crypto\Parameters\ClpEd25519Blake2BPrivateKeyParameters.pas"/>
         <UnitName Value="ClpEd25519Blake2BPrivateKeyParameters"/>
-      </Item320>
-      <Item321>
+      </Item319>
+      <Item320>
         <Filename Value="..\..\Crypto\Parameters\ClpEd25519Blake2BPublicKeyParameters.pas"/>
         <UnitName Value="ClpEd25519Blake2BPublicKeyParameters"/>
-      </Item321>
-      <Item322>
+      </Item320>
+      <Item321>
         <Filename Value="..\..\Crypto\Parameters\ClpEd25519PublicKeyParameters.pas"/>
         <UnitName Value="ClpEd25519PublicKeyParameters"/>
-      </Item322>
-      <Item323>
+      </Item321>
+      <Item322>
         <Filename Value="..\..\Crypto\Parameters\ClpEd25519PrivateKeyParameters.pas"/>
         <UnitName Value="ClpEd25519PrivateKeyParameters"/>
-      </Item323>
-      <Item324>
+      </Item322>
+      <Item323>
         <Filename Value="..\..\Crypto\Parameters\ClpX25519PublicKeyParameters.pas"/>
         <UnitName Value="ClpX25519PublicKeyParameters"/>
-      </Item324>
-      <Item325>
+      </Item323>
+      <Item324>
         <Filename Value="..\..\Crypto\Parameters\ClpX25519PrivateKeyParameters.pas"/>
         <UnitName Value="ClpX25519PrivateKeyParameters"/>
-      </Item325>
-      <Item326>
+      </Item324>
+      <Item325>
         <Filename Value="..\..\Crypto\Generators\ClpEd25519Blake2BKeyPairGenerator.pas"/>
         <UnitName Value="ClpEd25519Blake2BKeyPairGenerator"/>
-      </Item326>
-      <Item327>
+      </Item325>
+      <Item326>
         <Filename Value="..\..\Crypto\Generators\ClpEd25519KeyPairGenerator.pas"/>
         <UnitName Value="ClpEd25519KeyPairGenerator"/>
-      </Item327>
-      <Item328>
+      </Item326>
+      <Item327>
         <Filename Value="..\..\Crypto\Generators\ClpX25519KeyPairGenerator.pas"/>
         <UnitName Value="ClpX25519KeyPairGenerator"/>
-      </Item328>
-      <Item329>
+      </Item327>
+      <Item328>
         <Filename Value="..\..\Crypto\Signers\ClpEd25519PhBlake2BSigner.pas"/>
         <UnitName Value="ClpEd25519PhBlake2BSigner"/>
-      </Item329>
-      <Item330>
+      </Item328>
+      <Item329>
         <Filename Value="..\..\Crypto\Signers\ClpEd25519PhSigner.pas"/>
         <UnitName Value="ClpEd25519PhSigner"/>
-      </Item330>
-      <Item331>
+      </Item329>
+      <Item330>
         <Filename Value="..\..\Crypto\Signers\ClpEd25519Signer.pas"/>
         <UnitName Value="ClpEd25519Signer"/>
-      </Item331>
-      <Item332>
+      </Item330>
+      <Item331>
         <Filename Value="..\..\Crypto\Signers\ClpEd25519CtxBlake2BSigner.pas"/>
         <UnitName Value="ClpEd25519CtxBlake2BSigner"/>
-      </Item332>
-      <Item333>
+      </Item331>
+      <Item332>
         <Filename Value="..\..\Crypto\Signers\ClpEd25519CtxSigner.pas"/>
         <UnitName Value="ClpEd25519CtxSigner"/>
-      </Item333>
-      <Item334>
+      </Item332>
+      <Item333>
         <Filename Value="..\..\Crypto\Signers\ClpEd25519Blake2BSigner.pas"/>
         <UnitName Value="ClpEd25519Blake2BSigner"/>
+      </Item333>
+      <Item334>
+        <Filename Value="..\..\Asn1\TeleTrust\ClpTeleTrusTNamedCurves.pas"/>
+        <UnitName Value="ClpTeleTrusTNamedCurves"/>
       </Item334>
+      <Item335>
+        <Filename Value="..\..\Security\ClpAgreementUtilities.pas"/>
+        <UnitName Value="ClpAgreementUtilities"/>
+      </Item335>
     </Files>
     <RequiredPkgs Count="3">
       <Item1>

+ 13 - 14
CryptoLib/src/Packages/FPC/CryptoLib4PascalPackage.pas

@@ -79,19 +79,18 @@ uses
   ClpIECDHCBasicAgreement, ClpHMacDsaKCalculator, ClpIHMacDsaKCalculator, 
   ClpHkdfBytesGenerator, ClpIHkdfBytesGenerator, ClpHkdfParameters, 
   ClpIHkdfParameters, ClpDsaParameterGenerationParameters, 
-  ClpIDsaParameterGenerationParameters, ClpValidityPrecompInfo, 
-  ClpIValidityPrecompInfo, ClpDsaParametersGenerator, ClpDsaParameter, 
-  ClpIDsaParameter, ClpIKeyEncoder, ClpIDsaParametersGenerator, 
-  ClpIPreCompCallBack, ClpNistNamedCurves, ClpNat256, ClpNat320, 
-  ClpAesLightEngine, ClpIAesLightEngine, ClpCustomNamedCurves, ClpNat384, 
-  ClpNat192, ClpNat512, ClpInterleave, ClpBsiObjectIdentifiers, 
-  ClpEacObjectIdentifiers, ClpIDsaExt, ClpISchnorrDigestSigner, 
-  ClpIECSchnorrSipaSigner, ClpECSchnorrSipaSigner, ClpSchnorrDigestSigner, 
-  ClpISchnorr, ClpISchnorrExt, ClpBlowfishEngine, ClpIBlowfishEngine, ClpECC, 
-  ClpAsn1Objects, ClpSignersEncodings, ClpISignersEncodings, ClpEncoders, 
-  ClpSecT283Custom, ClpSecP521R1Custom, ClpSecP384R1Custom, 
-  ClpSecP256R1Custom, ClpSecP256K1Custom, ClpIX9ECC, ClpX9ECC, 
-  ClpIAsn1Objects, ClpBlockCipherModes, ClpECCurveConstants, 
+  ClpIDsaParameterGenerationParameters, ClpIValidityPrecompInfo, 
+  ClpDsaParametersGenerator, ClpDsaParameter, ClpIDsaParameter, 
+  ClpIKeyEncoder, ClpIDsaParametersGenerator, ClpIPreCompCallBack, 
+  ClpNistNamedCurves, ClpNat256, ClpNat320, ClpAesLightEngine, 
+  ClpIAesLightEngine, ClpCustomNamedCurves, ClpNat384, ClpNat192, ClpNat512, 
+  ClpInterleave, ClpBsiObjectIdentifiers, ClpEacObjectIdentifiers, ClpIDsaExt, 
+  ClpISchnorrDigestSigner, ClpIECSchnorrSipaSigner, ClpECSchnorrSipaSigner, 
+  ClpSchnorrDigestSigner, ClpISchnorr, ClpISchnorrExt, ClpBlowfishEngine, 
+  ClpIBlowfishEngine, ClpECC, ClpAsn1Objects, ClpSignersEncodings, 
+  ClpISignersEncodings, ClpEncoders, ClpSecT283Custom, ClpSecP521R1Custom, 
+  ClpSecP384R1Custom, ClpSecP256R1Custom, ClpSecP256K1Custom, ClpIX9ECC, 
+  ClpX9ECC, ClpIAsn1Objects, ClpBlockCipherModes, ClpECCurveConstants, 
   ClpIBlockCipherModes, ClpIPaddingModes, ClpISecP256K1Custom, 
   ClpISecP256R1Custom, ClpISecP384R1Custom, ClpISecP521R1Custom, 
   ClpISecT283Custom, ClpPaddingModes, ClpIECC, ClpISpeckEngine, 
@@ -120,7 +119,7 @@ uses
   ClpEd25519Blake2BKeyPairGenerator, ClpEd25519KeyPairGenerator, 
   ClpX25519KeyPairGenerator, ClpEd25519PhBlake2BSigner, ClpEd25519PhSigner, 
   ClpEd25519Signer, ClpEd25519CtxBlake2BSigner, ClpEd25519CtxSigner, 
-  ClpEd25519Blake2BSigner;
+  ClpEd25519Blake2BSigner, ClpTeleTrusTNamedCurves, ClpAgreementUtilities;
 
 implementation
 

+ 171 - 0
CryptoLib/src/Security/ClpAgreementUtilities.pas

@@ -0,0 +1,171 @@
+{ *********************************************************************************** }
+{ *                              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 ClpAgreementUtilities;
+
+{$I ..\Include\CryptoLib.inc}
+
+interface
+
+uses
+  SysUtils,
+  Generics.Collections,
+  ClpIBasicAgreement,
+  ClpECDHBasicAgreement,
+  ClpIECDHBasicAgreement,
+  ClpECDHCBasicAgreement,
+  ClpIECDHCBasicAgreement,
+  ClpX25519Agreement,
+  ClpIX25519Agreement,
+  ClpIRawAgreement,
+  ClpEdECObjectIdentifiers,
+  ClpIAsn1Objects,
+  ClpCryptoLibTypes;
+
+resourcestring
+  SUnRecognizedRawAgreementAlgorithm =
+    'Raw Agreement Algorithm "%s" Not Recognised.';
+  SUnRecognizedBasicAgreementAlgorithm =
+    'Basic Agreement Algorithm "%s" Not Recognised.';
+
+type
+
+  /// <summary>
+  /// Utility class for creating IBasicAgreement objects from their
+  /// names/Oids
+  /// </summary>
+  TAgreementUtilities = class sealed(TObject)
+
+  strict private
+    class var
+
+      Falgorithms: TDictionary<String, String>;
+
+    class function GetMechanism(const algorithm: String): String;
+      static; inline;
+
+    class procedure Boot(); static;
+    class constructor CreateAgreementUtilities();
+    class destructor DestroyAgreementUtilities();
+
+  public
+    class function GetBasicAgreement(const algorithm: String)
+      : IBasicAgreement; static;
+
+    class function GetRawAgreement(const oid: IDerObjectIdentifier)
+      : IRawAgreement; overload; static; inline;
+
+    class function GetRawAgreement(const algorithm: String): IRawAgreement;
+      overload; static;
+
+    class function GetAlgorithmName(const oid: IDerObjectIdentifier): String;
+      static; inline;
+
+  end;
+
+implementation
+
+{ TAgreementUtilities }
+
+class procedure TAgreementUtilities.Boot;
+begin
+  Falgorithms := TDictionary<string, string>.Create();
+  Falgorithms.Add(TEdECObjectIdentifiers.id_X25519.Id, 'X25519');
+end;
+
+class constructor TAgreementUtilities.CreateAgreementUtilities;
+begin
+  TAgreementUtilities.Boot;
+end;
+
+class destructor TAgreementUtilities.DestroyAgreementUtilities;
+begin
+  Falgorithms.Free;
+end;
+
+class function TAgreementUtilities.GetMechanism(const algorithm
+  : String): String;
+var
+  upper, mechanism: String;
+begin
+  upper := UpperCase(algorithm);
+  if Falgorithms.TryGetValue(upper, mechanism) then
+  begin
+    result := mechanism
+  end
+  else
+  begin
+    result := upper;
+  end;
+end;
+
+class function TAgreementUtilities.GetAlgorithmName
+  (const oid: IDerObjectIdentifier): String;
+begin
+  if not(Falgorithms.TryGetValue(oid.Id, result)) then
+  begin
+    result := '';
+  end;
+end;
+
+class function TAgreementUtilities.GetBasicAgreement(const algorithm: String)
+  : IBasicAgreement;
+var
+  mechanism: String;
+begin
+  mechanism := GetMechanism(algorithm);
+
+  if (mechanism = 'ECDH') then
+  begin
+    result := TECDHBasicAgreement.Create() as IECDHBasicAgreement;
+    Exit;
+  end;
+
+  if ((mechanism = 'ECDHC') or (mechanism = 'ECCDH')) then
+  begin
+    result := TECDHCBasicAgreement.Create() as IECDHCBasicAgreement;
+    Exit;
+  end;
+
+  raise ESecurityUtilityCryptoLibException.CreateResFmt
+    (@SUnRecognizedBasicAgreementAlgorithm, [algorithm]);
+end;
+
+class function TAgreementUtilities.GetRawAgreement(const algorithm: String)
+  : IRawAgreement;
+var
+  mechanism: String;
+begin
+  mechanism := GetMechanism(algorithm);
+
+  if (mechanism = 'X25519') then
+  begin
+    result := TX25519Agreement.Create() as IX25519Agreement;
+    Exit;
+  end;
+
+  raise ESecurityUtilityCryptoLibException.CreateResFmt
+    (@SUnRecognizedRawAgreementAlgorithm, [algorithm]);
+end;
+
+class function TAgreementUtilities.GetRawAgreement
+  (const oid: IDerObjectIdentifier): IRawAgreement;
+begin
+  result := GetRawAgreement(oid.Id);
+end;
+
+end.