Ugochukwu Mmaduekwe 2 недель назад
Родитель
Сommit
3817e64c13

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

@@ -78,7 +78,6 @@ uses
   ClpDHAgreement in '..\..\CryptoLib\src\Crypto\Agreements\ClpDHAgreement.pas',
   ClpDHBasicAgreement in '..\..\CryptoLib\src\Crypto\Agreements\ClpDHBasicAgreement.pas',
   ClpDHBasicKeyPairGenerator in '..\..\CryptoLib\src\Crypto\Generators\ClpDHBasicKeyPairGenerator.pas',
-  ClpDHDomainParameters in '..\..\CryptoLib\src\Asn1\X9\ClpDHDomainParameters.pas',
   ClpDHKeyGenerationParameters in '..\..\CryptoLib\src\Crypto\Parameters\ClpDHKeyGenerationParameters.pas',
   ClpDHKeyGeneratorHelper in '..\..\CryptoLib\src\Crypto\Generators\ClpDHKeyGeneratorHelper.pas',
   ClpDHKeyPairGenerator in '..\..\CryptoLib\src\Crypto\Generators\ClpDHKeyPairGenerator.pas',
@@ -89,7 +88,6 @@ uses
   ClpDHPrivateKeyParameters in '..\..\CryptoLib\src\Crypto\Parameters\ClpDHPrivateKeyParameters.pas',
   ClpDHPublicKeyParameters in '..\..\CryptoLib\src\Crypto\Parameters\ClpDHPublicKeyParameters.pas',
   ClpDHValidationParameters in '..\..\CryptoLib\src\Crypto\Parameters\ClpDHValidationParameters.pas',
-  ClpDHValidationParams in '..\..\CryptoLib\src\Asn1\X9\ClpDHValidationParams.pas',
   ClpDigest in '..\..\CryptoLib\src\Crypto\Digests\ClpDigest.pas',
   ClpDigestRandomGenerator in '..\..\CryptoLib\src\Rngs\ClpDigestRandomGenerator.pas',
   ClpDigestSink in '..\..\CryptoLib\src\Crypto\IO\ClpDigestSink.pas',
@@ -184,7 +182,6 @@ uses
   ClpIDHAgreement in '..\..\CryptoLib\src\Interfaces\Crypto\Agreements\ClpIDHAgreement.pas',
   ClpIDHBasicAgreement in '..\..\CryptoLib\src\Interfaces\Crypto\Agreements\ClpIDHBasicAgreement.pas',
   ClpIDHBasicKeyPairGenerator in '..\..\CryptoLib\src\Interfaces\Crypto\Generators\ClpIDHBasicKeyPairGenerator.pas',
-  ClpIDHDomainParameters in '..\..\CryptoLib\src\Interfaces\Asn1\X9\ClpIDHDomainParameters.pas',
   ClpIDHKeyGenerationParameters in '..\..\CryptoLib\src\Interfaces\Crypto\Parameters\ClpIDHKeyGenerationParameters.pas',
   ClpIDHKeyGeneratorHelper in '..\..\CryptoLib\src\Interfaces\Crypto\Generators\ClpIDHKeyGeneratorHelper.pas',
   ClpIDHKeyPairGenerator in '..\..\CryptoLib\src\Interfaces\Crypto\Generators\ClpIDHKeyPairGenerator.pas',
@@ -194,7 +191,6 @@ uses
   ClpIDHPrivateKeyParameters in '..\..\CryptoLib\src\Interfaces\Crypto\Parameters\ClpIDHPrivateKeyParameters.pas',
   ClpIDHPublicKeyParameters in '..\..\CryptoLib\src\Interfaces\Crypto\Parameters\ClpIDHPublicKeyParameters.pas',
   ClpIDHValidationParameters in '..\..\CryptoLib\src\Interfaces\Crypto\Parameters\ClpIDHValidationParameters.pas',
-  ClpIDHValidationParams in '..\..\CryptoLib\src\Interfaces\Asn1\X9\ClpIDHValidationParams.pas',
   ClpIDigest in '..\..\CryptoLib\src\Interfaces\Crypto\Digests\ClpIDigest.pas',
   ClpIDigestFactory in '..\..\CryptoLib\src\Interfaces\Crypto\Operators\ClpIDigestFactory.pas',
   ClpIDigestRandomGenerator in '..\..\CryptoLib\src\Interfaces\Rngs\ClpIDigestRandomGenerator.pas',

+ 0 - 227
CryptoLib/src/Asn1/X9/ClpDHDomainParameters.pas

@@ -1,227 +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 ClpDHDomainParameters;
-
-{$I ..\..\Include\CryptoLib.inc}
-
-interface
-
-uses
-  ClpIDHDomainParameters,
-  ClpIDHValidationParams,
-  ClpDHValidationParams,
-  ClpAsn1Objects,
-  ClpIAsn1Objects,
-  ClpAsn1Core,
-  ClpIAsn1Core,
-  ClpAsn1Utilities,
-  ClpCryptoLibTypes;
-
-resourcestring
-  SPNil = 'P Cannot be Nil';
-  SGNil = 'G Cannot be Nil';
-  SQNil = 'Q Cannot be Nil';
-  SJNil = 'J Cannot be Nil';
-  SBadSequenceSize = 'Bad Sequence Size "seq": %d';
-  SInvalidDHDomainParameters = 'Invalid DHDomainParameters: %s';
-  SUnexpectedElementsInSequence = 'Unexpected elements in sequence';
-
-type
-  TDHDomainParameters = class(TAsn1Encodable, IDHDomainParameters)
-
-  strict private
-  var
-    Fp, Fg, Fq, Fj: IDerInteger;
-    FvalidationParams: IDHValidationParams;
-
-    function GetP: IDerInteger; inline;
-    function GetG: IDerInteger; inline;
-    function GetQ: IDerInteger; inline;
-    function GetJ: IDerInteger; inline;
-    function GetValidationParams: IDHValidationParams; inline;
-
-    constructor Create(const seq: IAsn1Sequence); overload;
-
-  public
-    constructor Create(const p, g, q, j: IDerInteger;
-      const validationParams: IDHValidationParams); overload;
-
-    function ToAsn1Object(): IAsn1Object; override;
-
-    property p: IDerInteger read GetP;
-
-    property g: IDerInteger read GetG;
-
-    property q: IDerInteger read GetQ;
-
-    property j: IDerInteger read GetJ;
-
-    property validationParams: IDHValidationParams read GetValidationParams;
-
-    class function GetInstance(const obj: IAsn1TaggedObject;
-      isExplicit: Boolean): IDHDomainParameters; overload; static; inline;
-
-    class function GetInstance(obj: TObject): IDHDomainParameters; overload;
-      static; inline;
-
-  end;
-
-implementation
-
-{ TDHDomainParameters }
-
-function TDHDomainParameters.GetP: IDerInteger;
-begin
-  result := Fp;
-end;
-
-function TDHDomainParameters.GetG: IDerInteger;
-begin
-  result := Fg;
-end;
-
-function TDHDomainParameters.GetJ: IDerInteger;
-begin
-  result := Fj;
-end;
-
-function TDHDomainParameters.GetQ: IDerInteger;
-begin
-  result := Fq;
-end;
-
-function TDHDomainParameters.GetValidationParams: IDHValidationParams;
-begin
-  result := FvalidationParams;
-end;
-
-constructor TDHDomainParameters.Create(const seq: IAsn1Sequence);
-var
-  LCount: Int32;
-  LPos: Int32;
-begin
-  Inherited Create();
-  LCount := seq.Count;
-  LPos := 0;
-  if (LCount < 3) or (LCount > 5) then
-  begin
-    raise EArgumentCryptoLibException.CreateResFmt(@SBadSequenceSize,
-      [LCount]);
-  end;
-
-  Fp := TDerInteger.GetInstance(seq[LPos] as TAsn1Encodable);
-  System.Inc(LPos);
-
-  Fg := TDerInteger.GetInstance(seq[LPos] as TAsn1Encodable);
-  System.Inc(LPos);
-
-  Fq := TDerInteger.GetInstance(seq[LPos] as TAsn1Encodable);
-  System.Inc(LPos);
-
-  Fj := TAsn1Utilities.ReadOptional<IDerInteger>(seq, LPos, function(AElement: IAsn1Encodable): IDerInteger
-    begin
-      Result := TDerInteger.GetOptional(AElement);
-    end);
-
-  FvalidationParams := TAsn1Utilities.ReadOptional<IDHValidationParams>(seq, LPos, function(AElement: IAsn1Encodable): IDHValidationParams
-    begin
-      Result := TDHValidationParams.GetOptional(AElement);
-    end);
-
-  if LPos <> LCount then
-    raise EArgumentCryptoLibException.CreateRes(@SUnexpectedElementsInSequence);
-end;
-
-constructor TDHDomainParameters.Create(const p, g, q, j: IDerInteger;
-  const validationParams: IDHValidationParams);
-begin
-  Inherited Create();
-
-  if (p = Nil) then
-  begin
-    raise EArgumentNilCryptoLibException.CreateRes(@SPNil);
-  end;
-
-  if (g = Nil) then
-  begin
-    raise EArgumentNilCryptoLibException.CreateRes(@SGNil);
-  end;
-
-  if (q = Nil) then
-  begin
-    raise EArgumentNilCryptoLibException.CreateRes(@SQNil);
-  end;
-
-  if (j = Nil) then
-  begin
-    raise EArgumentNilCryptoLibException.CreateRes(@SJNil);
-  end;
-
-  Fp := p;
-  Fg := g;
-  Fq := q;
-  Fj := j;
-  FvalidationParams := validationParams;
-end;
-
-class function TDHDomainParameters.GetInstance(obj: TObject)
-  : IDHDomainParameters;
-begin
-  if ((obj = Nil) or (obj is TDHDomainParameters)) then
-  begin
-    result := obj as TDHDomainParameters;
-    Exit;
-  end;
-
-  if (obj is TAsn1Sequence) then
-  begin
-    result := TDHDomainParameters.Create(obj as TAsn1Sequence);
-    Exit;
-  end;
-
-  raise EArgumentCryptoLibException.CreateResFmt(@SInvalidDHDomainParameters,
-    [obj.ToString]);
-end;
-
-class function TDHDomainParameters.GetInstance(const obj: IAsn1TaggedObject;
-  isExplicit: Boolean): IDHDomainParameters;
-begin
-  result := GetInstance(TAsn1Sequence.GetInstance(obj, isExplicit)
-    as TAsn1Sequence);
-end;
-
-function TDHDomainParameters.ToAsn1Object: IAsn1Object;
-var
-  v: IAsn1EncodableVector;
-begin
-  v := TAsn1EncodableVector.Create([p, g, q]);
-
-  if (Fj <> Nil) then
-  begin
-    v.Add([Fj]);
-  end;
-
-  if (FvalidationParams <> Nil) then
-  begin
-    v.Add([FvalidationParams]);
-  end;
-
-  result := TDerSequence.Create(v);
-end;
-
-end.

+ 0 - 173
CryptoLib/src/Asn1/X9/ClpDHValidationParams.pas

@@ -1,173 +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 ClpDHValidationParams;
-
-{$I ..\..\Include\CryptoLib.inc}
-
-interface
-
-uses
-  SysUtils,
-  ClpIDHValidationParams,
-  ClpAsn1Objects,
-  ClpIAsn1Objects,
-  ClpAsn1Core,
-  ClpIAsn1Core,
-  ClpCryptoLibTypes;
-
-resourcestring
-  SSeedNil = 'Seed Cannot be Nil';
-  SPGenCounterNil = 'PGenCounter Cannot be Nil';
-  SBadSequenceSize = 'Bad Sequence Size "seq": %d';
-  SInvalidDHValidationParams = 'Invalid DHValidationParams: %s';
-
-type
-  TDHValidationParams = class(TAsn1Encodable, IDHValidationParams)
-
-  strict private
-  var
-    Fseed: IDerBitString;
-    FpgenCounter: IDerInteger;
-
-    function GetSeed: IDerBitString; inline;
-    function GetPGenCounter: IDerInteger; inline;
-
-    constructor Create(const seq: IAsn1Sequence); overload;
-
-  public
-    constructor Create(const seed: IDerBitString;
-      const pgenCounter: IDerInteger); overload;
-
-    function ToAsn1Object(): IAsn1Object; override;
-
-    property seed: IDerBitString read GetSeed;
-
-    property pgenCounter: IDerInteger read GetPGenCounter;
-
-    class function GetInstance(const obj: IAsn1TaggedObject;
-      isExplicit: Boolean): IDHValidationParams; overload; static; inline;
-
-    class function GetInstance(obj: TObject): IDHValidationParams; overload;
-      static; inline;
-
-    class function GetOptional(const AElement: IAsn1Encodable): IDHValidationParams; static;
-
-  end;
-
-implementation
-
-{ TDHValidationParams }
-
-function TDHValidationParams.GetPGenCounter: IDerInteger;
-begin
-  result := FpgenCounter;
-end;
-
-function TDHValidationParams.GetSeed: IDerBitString;
-begin
-  result := Fseed;
-end;
-
-function TDHValidationParams.ToAsn1Object: IAsn1Object;
-begin
-  result := TDerSequence.Create([Fseed, FpgenCounter]);
-end;
-
-constructor TDHValidationParams.Create(const seq: IAsn1Sequence);
-begin
-  Inherited Create();
-  if (seq.Count <> 2) then
-  begin
-    raise EArgumentCryptoLibException.CreateResFmt(@SBadSequenceSize,
-      [seq.Count]);
-  end;
-
-  Fseed := TDerBitString.GetInstance(seq[0] as TAsn1Encodable);
-  FpgenCounter := TDerInteger.GetInstance(seq[1] as TAsn1Encodable);
-end;
-
-constructor TDHValidationParams.Create(const seed: IDerBitString;
-  const pgenCounter: IDerInteger);
-begin
-  Inherited Create();
-
-  if (seed = Nil) then
-  begin
-    raise EArgumentNilCryptoLibException.CreateRes(@SSeedNil);
-  end;
-
-  if (pgenCounter = Nil) then
-  begin
-    raise EArgumentNilCryptoLibException.CreateRes(@SPGenCounterNil);
-  end;
-
-  Fseed := seed;
-  FpgenCounter := pgenCounter;
-end;
-
-class function TDHValidationParams.GetInstance(obj: TObject)
-  : IDHValidationParams;
-begin
-  if ((obj = Nil) or (obj is TDHValidationParams)) then
-  begin
-    result := obj as TDHValidationParams;
-    Exit;
-  end;
-
-  if (obj is TAsn1Sequence) then
-  begin
-    result := TDHValidationParams.Create(obj as TAsn1Sequence);
-    Exit;
-  end;
-
-  raise EArgumentCryptoLibException.CreateResFmt(@SInvalidDHValidationParams,
-    [obj.ToString]);
-end;
-
-class function TDHValidationParams.GetInstance(const obj: IAsn1TaggedObject;
-  isExplicit: Boolean): IDHValidationParams;
-begin
-  result := GetInstance(TAsn1Sequence.GetInstance(obj, isExplicit)
-    as TAsn1Sequence);
-end;
-
-class function TDHValidationParams.GetOptional(const AElement: IAsn1Encodable): IDHValidationParams;
-var
-  LValidationParams: IDHValidationParams;
-  LAsn1Sequence: IAsn1Sequence;
-begin
-  if AElement = nil then
-    raise EArgumentNilCryptoLibException.Create('element');
-
-  if Supports(AElement, IDHValidationParams, LValidationParams) then
-  begin
-    Result := LValidationParams;
-    Exit;
-  end;
-
-  LAsn1Sequence := TAsn1Sequence.GetOptional(AElement);
-  if LAsn1Sequence <> nil then
-  begin
-    Result := TDHValidationParams.Create(LAsn1Sequence);
-    Exit;
-  end;
-
-  Result := nil;
-end;
-
-end.

+ 376 - 8
CryptoLib/src/Asn1/X9/ClpX9Asn1Objects.pas

@@ -37,6 +37,14 @@ resourcestring
   SInvalidParameters = 'Invalid parameters';
   SBadSequenceSize = 'Bad sequence size: %d';
   SUnexpectedElementsInSequence = 'Unexpected elements in sequence';
+  SSeedNil = 'Seed Cannot be Nil';
+  SPGenCounterNil = 'PGenCounter Cannot be Nil';
+  SInvalidDHValidationParms = 'Invalid DHValidationParms: %s';
+  SPNil = 'P Cannot be Nil';
+  SGNil = 'G Cannot be Nil';
+  SQNil = 'Q Cannot be Nil';
+  SJNil = 'J Cannot be Nil';
+  SInvalidDHDomainParameters = 'Invalid DHDomainParameters: %s';
 
 type
   /// <summary>
@@ -63,8 +71,9 @@ type
       AExplicitly: Boolean): IX962Parameters; overload; static;
     class function GetOptional(const AElement: IAsn1Encodable): IX962Parameters; static;
 
-    constructor Create(const AParameters: IAsn1Object); overload;
-    constructor Create(const AParameters: IAsn1Encodable); overload;
+    constructor Create(const AParameters: IX9ECParameters); overload;
+    constructor Create(const AParameters: IDerObjectIdentifier); overload;
+    constructor Create(const AParameters: IAsn1Null); overload;
 
     function ToAsn1Object: IAsn1Object; override;
 
@@ -72,6 +81,116 @@ type
 
   end;
 
+  /// <summary>
+  /// The DHValidationParms object.
+  /// </summary>
+  TDHValidationParms = class(TAsn1Encodable, IDHValidationParms)
+
+  strict private
+  var
+    FSeed: IDerBitString;
+    FPGenCounter: IDerInteger;
+
+  strict protected
+    function GetSeed: IDerBitString;
+    function GetPGenCounter: IDerInteger;
+
+    constructor Create(const ASeq: IAsn1Sequence); overload;
+
+  public
+    /// <summary>
+    /// Parse a DHValidationParms from an object.
+    /// </summary>
+    class function GetInstance(AObj: TObject): IDHValidationParms; overload; static;
+    /// <summary>
+    /// Get instance from ASN.1 convertible.
+    /// </summary>
+    class function GetInstance(const AObj: IAsn1Convertible): IDHValidationParms; overload; static;
+    /// <summary>
+    /// Parse a DHValidationParms from DER-encoded bytes.
+    /// </summary>
+    class function GetInstance(const AEncoded: TCryptoLibByteArray): IDHValidationParms; overload; static;
+    /// <summary>
+    /// Parse a DHValidationParms from a tagged object.
+    /// </summary>
+    class function GetInstance(const AObj: IAsn1TaggedObject;
+      AExplicitly: Boolean): IDHValidationParms; overload; static;
+    /// <summary>
+    /// Get optional DHValidationParms.
+    /// </summary>
+    class function GetOptional(const AElement: IAsn1Encodable): IDHValidationParms; static;
+    /// <summary>
+    /// Get tagged DHValidationParms.
+    /// </summary>
+    class function GetTagged(const ATaggedObject: IAsn1TaggedObject;
+      ADeclaredExplicit: Boolean): IDHValidationParms; static;
+
+    constructor Create(const ASeed: IDerBitString;
+      const APGenCounter: IDerInteger); overload;
+
+    function ToAsn1Object: IAsn1Object; override;
+
+    property Seed: IDerBitString read GetSeed;
+    property PGenCounter: IDerInteger read GetPGenCounter;
+
+  end;
+
+  /// <summary>
+  /// The DHDomainParameters object.
+  /// </summary>
+  TDHDomainParameters = class(TAsn1Encodable, IDHDomainParameters)
+
+  strict private
+  var
+    FP, FG, FQ, FJ: IDerInteger;
+    FValidationParms: IDHValidationParms;
+
+  strict protected
+    function GetP: IDerInteger;
+    function GetG: IDerInteger;
+    function GetQ: IDerInteger;
+    function GetJ: IDerInteger;
+    function GetValidationParms: IDHValidationParms;
+
+    constructor Create(const ASeq: IAsn1Sequence); overload;
+
+  public
+    /// <summary>
+    /// Parse a DHDomainParameters from an object.
+    /// </summary>
+    class function GetInstance(AObj: TObject): IDHDomainParameters; overload; static;
+    /// <summary>
+    /// Get instance from ASN.1 convertible.
+    /// </summary>
+    class function GetInstance(const AObj: IAsn1Convertible): IDHDomainParameters; overload; static;
+    /// <summary>
+    /// Parse a DHDomainParameters from DER-encoded bytes.
+    /// </summary>
+    class function GetInstance(const AEncoded: TCryptoLibByteArray): IDHDomainParameters; overload; static;
+    /// <summary>
+    /// Parse a DHDomainParameters from a tagged object.
+    /// </summary>
+    class function GetInstance(const AObj: IAsn1TaggedObject;
+      AExplicitly: Boolean): IDHDomainParameters; overload; static;
+    /// <summary>
+    /// Get tagged DHDomainParameters.
+    /// </summary>
+    class function GetTagged(const ATaggedObject: IAsn1TaggedObject;
+      ADeclaredExplicit: Boolean): IDHDomainParameters; static;
+
+    constructor Create(const AP, AG, AQ, AJ: IDerInteger;
+      const AValidationParms: IDHValidationParms); overload;
+
+    function ToAsn1Object: IAsn1Object; override;
+
+    property P: IDerInteger read GetP;
+    property G: IDerInteger read GetG;
+    property Q: IDerInteger read GetQ;
+    property J: IDerInteger read GetJ;
+    property ValidationParms: IDHValidationParms read GetValidationParms;
+
+  end;
+
 implementation
 
 { TX962Parameters }
@@ -100,7 +219,7 @@ begin
   LECParams := TX9ECParameters.GetOptional(AElement);
   if LECParams <> nil then
   begin
-    Result := TX962Parameters.Create(LECParams.ToAsn1Object());
+    Result := TX962Parameters.Create(LECParams);
     Exit;
   end;
 
@@ -132,7 +251,7 @@ begin
   if Supports(AObj, IX962Parameters, Result) then
     Exit;
 
-  Result := GetOptional(AObj as IAsn1Encodable);
+  Result := GetOptional(AObj);
 end;
 
 class function TX962Parameters.GetInstance(const AElement: IAsn1Encodable): IX962Parameters;
@@ -173,19 +292,26 @@ begin
   Result := TAsn1Utilities.GetInstanceChoice<IX962Parameters>(AObj, AExplicitly,
     function(AElement: IAsn1Encodable): IX962Parameters
     begin
-      Result := GetInstance(AElement.ToAsn1Object());
+      Result := GetInstance(AElement);
     end);
 end;
 
-constructor TX962Parameters.Create(const AParameters: IAsn1Object);
+constructor TX962Parameters.Create(const AParameters: IX9ECParameters);
+begin
+  inherited Create();
+  FParameters := AParameters.ToAsn1Object();
+end;
+
+constructor TX962Parameters.Create(const AParameters: IDerObjectIdentifier);
 begin
   inherited Create();
   FParameters := AParameters;
 end;
 
-constructor TX962Parameters.Create(const AParameters: IAsn1Encodable);
+constructor TX962Parameters.Create(const AParameters: IAsn1Null);
 begin
-  Create(AParameters.ToAsn1Object());
+  inherited Create();
+  FParameters := AParameters;
 end;
 
 function TX962Parameters.GetParameters: IAsn1Object;
@@ -218,4 +344,246 @@ begin
   Result := FParameters;
 end;
 
+{ TDHValidationParms }
+
+class function TDHValidationParms.GetInstance(AObj: TObject): IDHValidationParms;
+begin
+  if AObj = nil then
+  begin
+    Result := nil;
+    Exit;
+  end;
+
+  if Supports(AObj, IDHValidationParms, Result) then
+    Exit;
+
+  Result := TDHValidationParms.Create(TAsn1Sequence.GetInstance(AObj));
+end;
+
+class function TDHValidationParms.GetInstance(const AObj: IAsn1Convertible): IDHValidationParms;
+begin
+  if AObj = nil then
+  begin
+    Result := nil;
+    Exit;
+  end;
+
+  if Supports(AObj, IDHValidationParms, Result) then
+    Exit;
+
+  Result := TDHValidationParms.Create(TAsn1Sequence.GetInstance(AObj));
+end;
+
+class function TDHValidationParms.GetInstance(const AEncoded: TCryptoLibByteArray): IDHValidationParms;
+begin
+  Result := TDHValidationParms.Create(TAsn1Sequence.GetInstance(AEncoded));
+end;
+
+class function TDHValidationParms.GetInstance(const AObj: IAsn1TaggedObject;
+  AExplicitly: Boolean): IDHValidationParms;
+begin
+  Result := TDHValidationParms.Create(TAsn1Sequence.GetInstance(AObj, AExplicitly));
+end;
+
+class function TDHValidationParms.GetOptional(const AElement: IAsn1Encodable): IDHValidationParms;
+var
+  LSequence: IAsn1Sequence;
+begin
+  if AElement = nil then
+    raise EArgumentNilCryptoLibException.Create('element');
+
+  if Supports(AElement, IDHValidationParms, Result) then
+    Exit;
+
+  LSequence := TAsn1Sequence.GetOptional(AElement);
+  if LSequence <> nil then
+    Result := TDHValidationParms.Create(LSequence)
+  else
+    Result := nil;
+end;
+
+class function TDHValidationParms.GetTagged(const ATaggedObject: IAsn1TaggedObject;
+  ADeclaredExplicit: Boolean): IDHValidationParms;
+begin
+  Result := TDHValidationParms.Create(TAsn1Sequence.GetTagged(ATaggedObject, ADeclaredExplicit));
+end;
+
+constructor TDHValidationParms.Create(const ASeq: IAsn1Sequence);
+begin
+  inherited Create();
+  if ASeq.Count <> 2 then
+    raise EArgumentCryptoLibException.CreateResFmt(@SBadSequenceSize, [ASeq.Count]);
+
+  FSeed := TDerBitString.GetInstance(ASeq[0]);
+  FPGenCounter := TDerInteger.GetInstance(ASeq[1]);
+end;
+
+constructor TDHValidationParms.Create(const ASeed: IDerBitString;
+  const APGenCounter: IDerInteger);
+begin
+  inherited Create();
+
+  if ASeed = nil then
+    raise EArgumentNilCryptoLibException.CreateRes(@SSeedNil);
+
+  if APGenCounter = nil then
+    raise EArgumentNilCryptoLibException.CreateRes(@SPGenCounterNil);
+
+  FSeed := ASeed;
+  FPGenCounter := APGenCounter;
+end;
+
+function TDHValidationParms.GetSeed: IDerBitString;
+begin
+  Result := FSeed;
+end;
+
+function TDHValidationParms.GetPGenCounter: IDerInteger;
+begin
+  Result := FPGenCounter;
+end;
+
+function TDHValidationParms.ToAsn1Object: IAsn1Object;
+begin
+  Result := TDerSequence.Create([FSeed, FPGenCounter]);
+end;
+
+{ TDHDomainParameters }
+
+class function TDHDomainParameters.GetInstance(AObj: TObject): IDHDomainParameters;
+begin
+  if AObj = nil then
+  begin
+    Result := nil;
+    Exit;
+  end;
+
+  if Supports(AObj, IDHDomainParameters, Result) then
+    Exit;
+
+  Result := TDHDomainParameters.Create(TAsn1Sequence.GetInstance(AObj));
+end;
+
+class function TDHDomainParameters.GetInstance(const AObj: IAsn1Convertible): IDHDomainParameters;
+begin
+  if AObj = nil then
+  begin
+    Result := nil;
+    Exit;
+  end;
+
+  if Supports(AObj, IDHDomainParameters, Result) then
+    Exit;
+
+  Result := TDHDomainParameters.Create(TAsn1Sequence.GetInstance(AObj));
+end;
+
+class function TDHDomainParameters.GetInstance(const AEncoded: TCryptoLibByteArray): IDHDomainParameters;
+begin
+  Result := TDHDomainParameters.Create(TAsn1Sequence.GetInstance(AEncoded));
+end;
+
+class function TDHDomainParameters.GetInstance(const AObj: IAsn1TaggedObject;
+  AExplicitly: Boolean): IDHDomainParameters;
+begin
+  Result := TDHDomainParameters.Create(TAsn1Sequence.GetInstance(AObj, AExplicitly));
+end;
+
+class function TDHDomainParameters.GetTagged(const ATaggedObject: IAsn1TaggedObject;
+  ADeclaredExplicit: Boolean): IDHDomainParameters;
+begin
+  Result := TDHDomainParameters.Create(TAsn1Sequence.GetTagged(ATaggedObject, ADeclaredExplicit));
+end;
+
+constructor TDHDomainParameters.Create(const ASeq: IAsn1Sequence);
+var
+  LCount, LPos: Int32;
+begin
+  inherited Create();
+  LCount := ASeq.Count;
+  LPos := 0;
+  if (LCount < 3) or (LCount > 5) then
+    raise EArgumentCryptoLibException.CreateResFmt(@SBadSequenceSize, [LCount]);
+
+  FP := TDerInteger.GetInstance(ASeq[LPos]);
+  System.Inc(LPos);
+
+  FG := TDerInteger.GetInstance(ASeq[LPos]);
+  System.Inc(LPos);
+
+  FQ := TDerInteger.GetInstance(ASeq[LPos]);
+  System.Inc(LPos);
+
+  FJ := TAsn1Utilities.ReadOptional<IDerInteger>(ASeq, LPos, function(AElement: IAsn1Encodable): IDerInteger
+    begin
+      Result := TDerInteger.GetOptional(AElement);
+    end);
+
+  FValidationParms := TAsn1Utilities.ReadOptional<IDHValidationParms>(ASeq, LPos, function(AElement: IAsn1Encodable): IDHValidationParms
+    begin
+      Result := TDHValidationParms.GetOptional(AElement);
+    end);
+
+  if LPos <> LCount then
+    raise EArgumentCryptoLibException.CreateRes(@SUnexpectedElementsInSequence);
+end;
+
+constructor TDHDomainParameters.Create(const AP, AG, AQ, AJ: IDerInteger;
+  const AValidationParms: IDHValidationParms);
+begin
+  inherited Create();
+
+  if AP = nil then
+    raise EArgumentNilCryptoLibException.CreateRes(@SPNil);
+
+  if AG = nil then
+    raise EArgumentNilCryptoLibException.CreateRes(@SGNil);
+
+  if AQ = nil then
+    raise EArgumentNilCryptoLibException.CreateRes(@SQNil);
+
+  FP := AP;
+  FG := AG;
+  FQ := AQ;
+  FJ := AJ;
+  FValidationParms := AValidationParms;
+end;
+
+function TDHDomainParameters.GetP: IDerInteger;
+begin
+  Result := FP;
+end;
+
+function TDHDomainParameters.GetG: IDerInteger;
+begin
+  Result := FG;
+end;
+
+function TDHDomainParameters.GetQ: IDerInteger;
+begin
+  Result := FQ;
+end;
+
+function TDHDomainParameters.GetJ: IDerInteger;
+begin
+  Result := FJ;
+end;
+
+function TDHDomainParameters.GetValidationParms: IDHValidationParms;
+begin
+  Result := FValidationParms;
+end;
+
+function TDHDomainParameters.ToAsn1Object: IAsn1Object;
+var
+  LV: IAsn1EncodableVector;
+begin
+  LV := TAsn1EncodableVector.Create([FP, FG, FQ]);
+  if FJ <> nil then
+    LV.Add([FJ]);
+  if FValidationParms <> nil then
+    LV.Add([FValidationParms]);
+  Result := TDerSequence.Create(LV);
+end;
+
 end.

+ 20 - 1
CryptoLib/src/Crypto/Parameters/ClpECDomainParameters.pas

@@ -31,7 +31,10 @@ uses
   ClpIX9ECParameters,
   ClpIAsn1Objects,
   ClpIX9Asn1Objects,
-  ClpX9ECParameters;
+  ClpX9ECParameters,
+  ClpX9ECC,
+  ClpIX9ECC,
+  ClpX9Asn1Objects;
 
 resourcestring
   SCurveNil = 'Curve Cannot be Nil';
@@ -93,6 +96,8 @@ type
     function Equals(const other: IECDomainParameters): Boolean; reintroduce;
     function GetHashCode(): {$IFDEF DELPHI}Int32; {$ELSE}PtrInt;
 {$ENDIF DELPHI}override;
+    function ToX962Parameters: IX962Parameters;
+    function ToX9ECParameters: IX9ECParameters;
 
   end;
 
@@ -288,4 +293,18 @@ begin
   end;
 end;
 
+function TECDomainParameters.ToX962Parameters: IX962Parameters;
+begin
+  Result := TX962Parameters.Create(ToX9ECParameters());
+end;
+
+function TECDomainParameters.ToX9ECParameters: IX9ECParameters;
+var
+  LG: IX9ECPoint;
+begin
+  // TODO Support for choosing compressed==true?
+  LG := TX9ECPoint.Create(g, False);
+  Result := TX9ECParameters.Create(curve, LG, n, h, seed);
+end;
+
 end.

+ 2 - 3
CryptoLib/src/Factories/ClpSubjectPublicKeyInfoFactory.pas

@@ -72,7 +72,6 @@ var
   LX25519Key: IX25519PublicKeyParameters;
   LKp: IDsaParameters;
   LParams: IECDomainParameters;
-  LX9: IX9ECParameters;
   LX962: IX962Parameters;
   LPubKey: TCryptoLibByteArray;
 begin
@@ -104,8 +103,8 @@ begin
     LParams := LECKey.Parameters;
     if LParams = nil then
       raise EArgumentCryptoLibException.Create('EC public key requires parameters.');
-    LX9 := TX9ECParameters.Create(LParams.Curve, LParams.G, LParams.N, LParams.H, LParams.Seed);
-    LX962 := TX962Parameters.Create(LX9.ToAsn1Object());
+
+    LX962 := LParams.ToX962Parameters();
     LAlgID := TAlgorithmIdentifier.Create(TX9ObjectIdentifiers.IdECPublicKey, LX962);
     LPubKey := LECKey.Q.GetEncoded(False);
     Result := TSubjectPublicKeyInfo.Create(LAlgID, LPubKey);

+ 0 - 52
CryptoLib/src/Interfaces/Asn1/X9/ClpIDHDomainParameters.pas

@@ -1,52 +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 ClpIDHDomainParameters;
-
-{$I ..\..\..\Include\CryptoLib.inc}
-
-interface
-
-uses
-  ClpIAsn1Core,
-  ClpIDHValidationParams,
-  ClpIAsn1Objects;
-
-type
-  IDHDomainParameters = interface(IAsn1Encodable)
-    ['{18288135-B71F-48B4-8595-57AAB9092FC8}']
-
-    function GetP: IDerInteger;
-    property p: IDerInteger read GetP;
-
-    function GetG: IDerInteger;
-    property g: IDerInteger read GetG;
-
-    function GetQ: IDerInteger;
-    property q: IDerInteger read GetQ;
-
-    function GetJ: IDerInteger;
-    property j: IDerInteger read GetJ;
-
-    function GetValidationParams: IDHValidationParams;
-    property validationParams: IDHValidationParams read GetValidationParams;
-
-  end;
-
-implementation
-
-end.

+ 0 - 42
CryptoLib/src/Interfaces/Asn1/X9/ClpIDHValidationParams.pas

@@ -1,42 +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 ClpIDHValidationParams;
-
-{$I ..\..\..\Include\CryptoLib.inc}
-
-interface
-
-uses
-  ClpIAsn1Core,
-  ClpIAsn1Objects;
-
-type
-  IDHValidationParams = interface(IAsn1Encodable)
-    ['{A75D3486-080A-43F5-9296-9C74B7DEE7DC}']
-
-    function GetSeed: IDerBitString;
-    property Seed: IDerBitString read GetSeed;
-
-    function GetPGenCounter: IDerInteger;
-    property PGenCounter: IDerInteger read GetPGenCounter;
-
-  end;
-
-implementation
-
-end.

+ 32 - 0
CryptoLib/src/Interfaces/Asn1/X9/ClpIX9Asn1Objects.pas

@@ -41,6 +41,38 @@ type
     property NamedCurve: IDerObjectIdentifier read GetNamedCurve;
   end;
 
+  /// <summary>
+  /// Interface for DHValidationParms.
+  /// </summary>
+  IDHValidationParms = interface(IAsn1Encodable)
+    ['{A75D3486-080A-43F5-9296-9C74B7DEE7DC}']
+
+    function GetSeed: IDerBitString;
+    function GetPGenCounter: IDerInteger;
+
+    property Seed: IDerBitString read GetSeed;
+    property PGenCounter: IDerInteger read GetPGenCounter;
+  end;
+
+  /// <summary>
+  /// Interface for DHDomainParameters.
+  /// </summary>
+  IDHDomainParameters = interface(IAsn1Encodable)
+    ['{18288135-B71F-48B4-8595-57AAB9092FC8}']
+
+    function GetP: IDerInteger;
+    function GetG: IDerInteger;
+    function GetQ: IDerInteger;
+    function GetJ: IDerInteger;
+    function GetValidationParms: IDHValidationParms;
+
+    property P: IDerInteger read GetP;
+    property G: IDerInteger read GetG;
+    property Q: IDerInteger read GetQ;
+    property J: IDerInteger read GetJ;
+    property ValidationParms: IDHValidationParms read GetValidationParms;
+  end;
+
 implementation
 
 end.

+ 5 - 1
CryptoLib/src/Interfaces/Crypto/Parameters/ClpIECDomainParameters.pas

@@ -24,7 +24,9 @@ interface
 uses
   ClpBigInteger,
   ClpIECC,
-  ClpCryptoLibTypes;
+  ClpCryptoLibTypes,
+  ClpIX9Asn1Objects,
+  ClpIX9ECParameters;
 
 type
   IECDomainParameters = interface(IInterface)
@@ -50,6 +52,8 @@ type
 {$ENDIF DELPHI}
     function ValidatePrivateScalar(const d: TBigInteger): TBigInteger;
     function ValidatePublicPoint(const q: IECPoint): IECPoint;
+    function ToX962Parameters: IX962Parameters;
+    function ToX9ECParameters: IX9ECParameters;
   end;
 
 implementation