Explorar el Código

some refactorings and compiler hint fixes

Ugochukwu Mmaduekwe hace 3 semanas
padre
commit
73e8c5bc7e

+ 157 - 149
CryptoLib/src/Asn1/ClpAsn1Objects.pas

@@ -154,8 +154,6 @@ type
   /// Factory for ASN.1 universal types.
   /// </summary>
   TAsn1UniversalTypes = class sealed(TObject)
-  strict private
-    constructor Create;
   public
     class function Get(ATagNo: Int32): IAsn1UniversalType; static;
   end;
@@ -437,16 +435,17 @@ type
     /// Get DER encoding with implicit tagging.
     /// </summary>
     function GetEncodingDerImplicit(ATagClass, ATagNo: Int32): IDerEncoding; virtual; abstract;
+    /// <summary>
+    /// Convert this object to an ASN.1 object (returns self).
+    /// </summary>
+    function ToAsn1Object(): IAsn1Object; override;
 
   private
     /// <summary>
     /// Create an ASN.1 object from a fixed buffer stream.
     /// </summary>
     class function FromBufferStream(const ABufferStream: TFixedBufferStream): IAsn1Object; static;
-    /// <summary>
-    /// Convert this object to an ASN.1 object (returns self).
-    /// </summary>
-    function ToAsn1Object(): IAsn1Object; override;
+
     /// <summary>
     /// Call Asn1Equals (internal method).
     /// </summary>
@@ -593,11 +592,6 @@ type
     /// Create from contents (does not copy, uses the array directly).
     /// </summary>
     class function WithContents(const AContents: TCryptoLibByteArray): IDerOctetString; static;
-
-    /// <summary>
-    /// Get encoding for the specified encoding type.
-    /// </summary>
-    function GetEncoding(AEncoding: Int32): IAsn1Encoding; override;
     /// <summary>
     /// Get encoding for the specified encoding type with implicit tagging.
     /// </summary>
@@ -606,6 +600,11 @@ type
     /// Get DER encoding.
     /// </summary>
     function GetEncodingDer(): IDerEncoding; override;
+
+    /// <summary>
+    /// Get encoding for the specified encoding type.
+    /// </summary>
+    function GetEncoding(AEncoding: Int32): IAsn1Encoding; override;
     /// <summary>
     /// Get DER encoding with implicit tagging.
     /// </summary>
@@ -631,10 +630,7 @@ type
   strict private
     FElements: TCryptoLibGenericArray<IAsn1OctetString>;
     class function GetEmpty(): IBerOctetString; static;
-    class function WithContents(const AContents: TCryptoLibByteArray): IBerOctetString; static;
-  strict protected
-    function GetEncoding(AEncoding: Int32): IAsn1Encoding; override;
-    function GetEncodingImplicit(AEncoding, ATagClass, ATagNo: Int32): IAsn1Encoding; override;
+
   public
     /// <summary>
     /// Empty BER octet string.
@@ -656,10 +652,16 @@ type
     /// Create a BER octet string from a sequence.
     /// </summary>
     class function FromSequence(const ASequence: IAsn1Sequence): IBerOctetString; static;
+
+    class function WithContents(const AContents: TCryptoLibByteArray): IBerOctetString; static;
     /// <summary>
     /// Create a BER octet string from an array of octet strings.
     /// </summary>
     constructor Create(const AOctetStrings: TCryptoLibGenericArray<IAsn1OctetString>); overload;
+
+    function GetEncoding(AEncoding: Int32): IAsn1Encoding; override;
+
+    function GetEncodingImplicit(AEncoding, ATagClass, ATagNo: Int32): IAsn1Encoding; override;
   end;
 
   /// <summary>
@@ -715,10 +717,7 @@ type
   strict protected
     FContents: TCryptoLibByteArray; // First byte is padBits, rest is data
     FBufferStream: TFixedBufferStream;
-    function GetEncoding(AEncoding: Int32): IAsn1Encoding; override;
-    function GetEncodingImplicit(AEncoding, ATagClass, ATagNo: Int32): IAsn1Encoding; override;
-    function GetEncodingDer(): IDerEncoding; override;
-    function GetEncodingDerImplicit(ATagClass, ATagNo: Int32): IDerEncoding; override;
+
   public
     class property EmptyOctetsContents: TCryptoLibByteArray read GetEmptyOctetsContents;
 
@@ -739,6 +738,11 @@ type
     function GetBufferStream(): TFixedBufferStream;
     function GetParser(): IAsn1BitStringParser;
     procedure CheckOctetAligned();
+
+    function GetEncoding(AEncoding: Int32): IAsn1Encoding; override;
+    function GetEncodingImplicit(AEncoding, ATagClass, ATagNo: Int32): IAsn1Encoding; override;
+    function GetEncodingDer(): IDerEncoding; override;
+    function GetEncodingDerImplicit(ATagClass, ATagNo: Int32): IDerEncoding; override;
   public
     type
       /// <summary>
@@ -833,9 +837,7 @@ type
   /// DL bit string implementation.
   /// </summary>
   TDLBitString = class(TDerBitString, IDLBitString)
-  strict protected
-    function GetEncoding(AEncoding: Int32): IAsn1Encoding; override;
-    function GetEncodingImplicit(AEncoding, ATagClass, ATagNo: Int32): IAsn1Encoding; override;
+
   public
     /// <summary>
     /// Create a DL bit string from contents (m_contents format: [padBits, data...]).
@@ -845,6 +847,9 @@ type
     /// Create a DL bit string from data and pad bits.
     /// </summary>
     constructor Create(const AData: TCryptoLibByteArray; APadBits: Int32); overload;
+
+    function GetEncoding(AEncoding: Int32): IAsn1Encoding; override;
+    function GetEncodingImplicit(AEncoding, ATagClass, ATagNo: Int32): IAsn1Encoding; override;
   end;
 
   /// <summary>
@@ -853,9 +858,7 @@ type
   TBerBitString = class(TDerBitString, IBerBitString)
   strict private
     FElements: TCryptoLibGenericArray<IDerBitString>;
-  strict protected
-    function GetEncoding(AEncoding: Int32): IAsn1Encoding; override;
-    function GetEncodingImplicit(AEncoding, ATagClass, ATagNo: Int32): IAsn1Encoding; override;
+
   public
     /// <summary>
     /// Flatten an array of bit strings into a single m_contents byte array.
@@ -869,6 +872,9 @@ type
     /// Create a BER bit string from an array of bit strings.
     /// </summary>
     constructor Create(const ABitStrings: TCryptoLibGenericArray<IDerBitString>); overload;
+
+    function GetEncoding(AEncoding: Int32): IAsn1Encoding; override;
+    function GetEncodingImplicit(AEncoding, ATagClass, ATagNo: Int32): IAsn1Encoding; override;
   end;
 
   /// <summary>
@@ -1191,10 +1197,6 @@ type
   strict protected
     function Asn1Equals(const AAsn1Object: IAsn1Object): Boolean; override;
     function Asn1GetHashCode(): Int32; override;
-    function GetEncoding(AEncoding: Int32): IAsn1Encoding; override;
-    function GetEncodingImplicit(AEncoding, ATagClass, ATagNo: Int32): IAsn1Encoding; override;
-    function GetEncodingDer(): IDerEncoding; override;
-    function GetEncodingDerImplicit(ATagClass, ATagNo: Int32): IDerEncoding; override;
     function RebuildConstructed(const AAsn1Object: IAsn1Object): IAsn1Sequence; override;
     function ReplaceTag(ATagClass, ATagNo: Int32): IAsn1TaggedObject; override;
 
@@ -1221,6 +1223,11 @@ type
     constructor Create(AExplicitness, ATagClass, ATagNo: Int32;
       const AObj: IAsn1Encodable); overload;
     function GetIsConstructed(): Boolean; override;
+
+    function GetEncoding(AEncoding: Int32): IAsn1Encoding; override;
+    function GetEncodingImplicit(AEncoding, ATagClass, ATagNo: Int32): IAsn1Encoding; override;
+    function GetEncodingDer(): IDerEncoding; override;
+    function GetEncodingDerImplicit(ATagClass, ATagNo: Int32): IDerEncoding; override;
   end;
 
   /// <summary>
@@ -1228,8 +1235,6 @@ type
   /// </summary>
   TDLTaggedObject = class(TDerTaggedObject, IDLTaggedObject)
   strict protected
-    function GetEncoding(AEncoding: Int32): IAsn1Encoding; override;
-    function GetEncodingImplicit(AEncoding, ATagClass, ATagNo: Int32): IAsn1Encoding; override;
     function RebuildConstructed(const AAsn1Object: IAsn1Object): IAsn1Sequence; override;
     function ReplaceTag(ATagClass, ATagNo: Int32): IAsn1TaggedObject; override;
 
@@ -1255,6 +1260,9 @@ type
     /// </summary>
     constructor Create(AExplicitness, ATagClass, ATagNo: Int32;
       const AObj: IAsn1Encodable); overload;
+
+    function GetEncoding(AEncoding: Int32): IAsn1Encoding; override;
+    function GetEncodingImplicit(AEncoding, ATagClass, ATagNo: Int32): IAsn1Encoding; override;
   end;
 
   /// <summary>
@@ -1373,16 +1381,16 @@ type
     class function GetEmpty(): IDerSequence; static;
     class function WithElements(const AElements: TCryptoLibGenericArray<IAsn1Encodable>): IDerSequence; static;
 
-  strict protected
-    function GetEncoding(AEncoding: Int32): IAsn1Encoding; override;
-    function GetEncodingImplicit(AEncoding, ATagClass, ATagNo: Int32): IAsn1Encoding; override;
-    function GetEncodingDer(): IDerEncoding; override;
-    function GetEncodingDerImplicit(ATagClass, ATagNo: Int32): IDerEncoding; override;
   public
     function ToAsn1BitString(): IDerBitString; override;
     function ToAsn1External(): IDerExternal; override;
     function ToAsn1OctetString(): IAsn1OctetString; override;
     function ToAsn1Set(): IAsn1Set; override;
+
+    function GetEncoding(AEncoding: Int32): IAsn1Encoding; override;
+    function GetEncodingImplicit(AEncoding, ATagClass, ATagNo: Int32): IAsn1Encoding; override;
+    function GetEncodingDer(): IDerEncoding; override;
+    function GetEncodingDerImplicit(ATagClass, ATagNo: Int32): IDerEncoding; override;
     
     class function FromCollection(const AC: TCryptoLibGenericArray<IAsn1Encodable>): IDerSequence; static;
     class function FromElement(const AElement: IAsn1Encodable): IDerSequence; static;
@@ -1419,10 +1427,6 @@ type
     class function GetEmpty(): IDLSequence; static;
     class function WithElements(const AElements: TCryptoLibGenericArray<IAsn1Encodable>): IDLSequence; static;
 
-  strict protected
-    function GetEncoding(AEncoding: Int32): IAsn1Encoding; override;
-    function GetEncodingImplicit(AEncoding, ATagClass, ATagNo: Int32): IAsn1Encoding; override;
-
   public
     class function FromCollection(const AC: TCryptoLibGenericArray<IAsn1Encodable>): IDLSequence; static;
     class function FromElement(const AElement: IAsn1Encodable): IDLSequence; static;
@@ -1444,6 +1448,9 @@ type
     constructor Create(const ASequence: IAsn1Sequence); overload;
     constructor Create(const ASet: IAsn1Set); overload;
 
+    function GetEncoding(AEncoding: Int32): IAsn1Encoding; override;
+    function GetEncodingImplicit(AEncoding, ATagClass, ATagNo: Int32): IAsn1Encoding; override;
+
     /// <summary>
     /// Convert to ASN.1 external.
     /// </summary>
@@ -1466,7 +1473,6 @@ type
   TAsn1Set = class abstract(TAsn1Object, IAsn1Set)
   strict private
     FElements: TCryptoLibGenericArray<IAsn1Encodable>;
-    
     type
       /// <summary>
       /// Internal parser implementation for sets.
@@ -1483,10 +1489,12 @@ type
 
     /// <summary>
     /// Sort elements based on their DER encodings.
+    /// Returns the sorted DER encodings array.
     /// </summary>
-    class procedure SortElements(const AElements: TCryptoLibGenericArray<IAsn1Encodable>); static;
+    class function SortElements(const AElements: TCryptoLibGenericArray<IAsn1Encodable>): TCryptoLibGenericArray<IDerEncoding>; static;
 
   strict protected
+    FSortedDerEncodings: TCryptoLibGenericArray<IDerEncoding>;
     function GetCount(): Int32; virtual;
   public
     type
@@ -1564,18 +1572,10 @@ type
   /// </summary>
   TDerSet = class(TAsn1Set, IDerSet)
   strict private
-    FSortedDerEncodings: TCryptoLibGenericArray<IDerEncoding>;
-    
     class function GetEmpty(): IDerSet; static;
     function GetSortedDerEncodings(): TCryptoLibGenericArray<IDerEncoding>;
     class function CreateSortedDerEncodings(const AElements: TCryptoLibGenericArray<IAsn1Encodable>): TCryptoLibGenericArray<IDerEncoding>; static;
 
-  strict protected
-    function GetEncoding(AEncoding: Int32): IAsn1Encoding; override;
-    function GetEncodingImplicit(AEncoding, ATagClass, ATagNo: Int32): IAsn1Encoding; override;
-    function GetEncodingDer(): IDerEncoding; override;
-    function GetEncodingDerImplicit(ATagClass, ATagNo: Int32): IDerEncoding; override;
-
   public
     class function FromCollection(const AC: TCryptoLibGenericArray<IAsn1Encodable>): IDerSet; static;
     class function FromElement(const AElement: IAsn1Encodable): IDerSet; static;
@@ -1590,6 +1590,11 @@ type
     constructor Create(const ASequence: IAsn1Sequence); overload;
     constructor Create(const ASet: IAsn1Set); overload;
 
+    function GetEncoding(AEncoding: Int32): IAsn1Encoding; override;
+    function GetEncodingImplicit(AEncoding, ATagClass, ATagNo: Int32): IAsn1Encoding; override;
+    function GetEncodingDer(): IDerEncoding; override;
+    function GetEncodingDerImplicit(ATagClass, ATagNo: Int32): IDerEncoding; override;
+
     class property Empty: IDerSet read GetEmpty;
   end;
 
@@ -1600,10 +1605,6 @@ type
   strict private
     class function GetEmpty(): IDLSet; static;
 
-  strict protected
-    function GetEncoding(AEncoding: Int32): IAsn1Encoding; override;
-    function GetEncodingImplicit(AEncoding, ATagClass, ATagNo: Int32): IAsn1Encoding; override;
-
   public
     class function FromCollection(const AC: TCryptoLibGenericArray<IAsn1Encodable>): IDLSet; static;
     class function FromElement(const AElement: IAsn1Encodable): IDLSet; static;
@@ -1619,6 +1620,9 @@ type
     constructor Create(const ASet: IAsn1Set); overload;
     constructor Create(AIsSorted: Boolean; const AElements: TCryptoLibGenericArray<IAsn1Encodable>); overload;
 
+    function GetEncoding(AEncoding: Int32): IAsn1Encoding; override;
+    function GetEncodingImplicit(AEncoding, ATagClass, ATagNo: Int32): IAsn1Encoding; override;
+
     class property Empty: IDLSet read GetEmpty;
   end;
 
@@ -1630,10 +1634,6 @@ type
     class function GetEmpty(): IBerSequence; static;
     class function WithElements(const AElements: TCryptoLibGenericArray<IAsn1Encodable>): IBerSequence; static;
 
-  strict protected
-    function GetEncoding(AEncoding: Int32): IAsn1Encoding; override;
-    function GetEncodingImplicit(AEncoding, ATagClass, ATagNo: Int32): IAsn1Encoding; override;
-
   public
     class function FromCollection(const AC: TCryptoLibGenericArray<IAsn1Encodable>): IBerSequence; static;
     class function FromElement(const AElement: IAsn1Encodable): IBerSequence; static;
@@ -1655,6 +1655,9 @@ type
     constructor Create(const ASequence: IAsn1Sequence); overload;
     constructor Create(const ASet: IAsn1Set); overload;
 
+    function GetEncoding(AEncoding: Int32): IAsn1Encoding; override;
+    function GetEncodingImplicit(AEncoding, ATagClass, ATagNo: Int32): IAsn1Encoding; override;
+
     function ToAsn1BitString(): IDerBitString; override;
     function ToAsn1External(): IDerExternal; override;
     function ToAsn1OctetString(): IAsn1OctetString; override;
@@ -1670,10 +1673,6 @@ type
   strict private
     class function GetEmpty(): IBerSet; static;
 
-  strict protected
-    function GetEncoding(AEncoding: Int32): IAsn1Encoding; override;
-    function GetEncodingImplicit(AEncoding, ATagClass, ATagNo: Int32): IAsn1Encoding; override;
-
   public
     class function FromCollection(const AC: TCryptoLibGenericArray<IAsn1Encodable>): IBerSet; static;
     class function FromElement(const AElement: IAsn1Encodable): IBerSet; static;
@@ -1689,6 +1688,9 @@ type
     constructor Create(const ASet: IAsn1Set); overload;
     constructor Create(AIsSorted: Boolean; const AElements: TCryptoLibGenericArray<IAsn1Encodable>); overload;
 
+    function GetEncoding(AEncoding: Int32): IAsn1Encoding; override;
+    function GetEncodingImplicit(AEncoding, ATagClass, ATagNo: Int32): IAsn1Encoding; override;
+
     class property Empty: IBerSet read GetEmpty;
   end;
 
@@ -1697,8 +1699,6 @@ type
   /// </summary>
   TBerTaggedObject = class(TDLTaggedObject, IBerTaggedObject)
   strict protected
-    function GetEncoding(AEncoding: Int32): IAsn1Encoding; override;
-    function GetEncodingImplicit(AEncoding, ATagClass, ATagNo: Int32): IAsn1Encoding; override;
     function RebuildConstructed(const AAsn1Object: IAsn1Object): IAsn1Sequence; override;
     function ReplaceTag(ATagClass, ATagNo: Int32): IAsn1TaggedObject; override;
 
@@ -1723,6 +1723,9 @@ type
     /// Public constructor.
     /// </summary>
     constructor Create(AExplicitness, ATagClass, ATagNo: Int32; const AObj: IAsn1Encodable); overload;
+
+    function GetEncoding(AEncoding: Int32): IAsn1Encoding; override;
+    function GetEncodingImplicit(AEncoding, ATagClass, ATagNo: Int32): IAsn1Encoding; override;
   end;
 
   /// <summary>
@@ -2181,7 +2184,7 @@ type
     constructor Create(AOutStream: TStream; ATagNo: Int32; AIsExplicit: Boolean); overload;
     destructor Destroy(); override;
     procedure AddObject(const AObj: IAsn1Encodable); overload; override;
-    procedure AddObject(const AObj: IAsn1Object); overload;
+    procedure AddObject(const AObj: IAsn1Object); overload; override;
     function GetRawOutputStream(): TStream; override;
     procedure Close(); override;
   end;
@@ -2325,7 +2328,7 @@ type
     class function CheckExternalContent(ATagNo: Int32; const AExternalContent: IAsn1Object): IAsn1Object; static;
     class function GetExternalContent(const AEncoding: IAsn1TaggedObject): IAsn1Object; overload; static;
     class function CheckDataValueDescriptor(const ADataValueDescriptor: IAsn1Object): IAsn1ObjectDescriptor; static;
-  protected
+  strict protected
     FDirectReference: IDerObjectIdentifier;
     FIndirectReference: IDerInteger;
     FDataValueDescriptor: IAsn1ObjectDescriptor;
@@ -2334,13 +2337,8 @@ type
     
     function BuildSequence(): IAsn1Sequence; virtual;
 
-  strict protected
     function Asn1Equals(const AAsn1Object: IAsn1Object): Boolean; override;
     function Asn1GetHashCode(): Int32; override;
-    function GetEncoding(AEncoding: Int32): IAsn1Encoding;  overload; override;
-    function GetEncodingImplicit(AEncoding, ATagClass, ATagNo: Int32): IAsn1Encoding; override;
-    function GetEncodingDer(): IDerEncoding; override;
-    function GetEncodingDerImplicit(ATagClass, ATagNo: Int32): IDerEncoding; override;
 
   public
     type
@@ -2369,10 +2367,17 @@ type
       const ADataValueDescriptor: IAsn1ObjectDescriptor;
       AEncoding: Int32; const AExternalData: IAsn1Object); overload;
     function GetSequence(): IAsn1Sequence;
+
+    function GetEncoding(AEncoding: Int32): IAsn1Encoding;  overload; override;
+    function GetEncodingImplicit(AEncoding, ATagClass, ATagNo: Int32): IAsn1Encoding; override;
+    function GetEncodingDer(): IDerEncoding; override;
+    function GetEncodingDerImplicit(ATagClass, ATagNo: Int32): IDerEncoding; override;
+
+    function GetEncoding(): Int32; reintroduce; overload;
+
     // Interface methods for IDerExternal
     function GetDataValueDescriptor(): IAsn1Object;
     function GetDirectReference(): IDerObjectIdentifier;
-    function GetEncoding(): Int32; overload;
     function GetExternalContent(): IAsn1Object; overload;
     function GetIndirectReference(): IDerInteger;
   end;
@@ -2383,9 +2388,6 @@ type
   TDLExternal = class sealed(TDerExternal, IDLExternal)
   protected
     function BuildSequence(): IAsn1Sequence; override;
-  strict protected
-    function GetEncoding(AEncoding: Int32): IAsn1Encoding; override;
-    function GetEncodingImplicit(AEncoding, ATagClass, ATagNo: Int32): IAsn1Encoding; override;
 
   public
     constructor Create(const AVector: IAsn1EncodableVector); overload;
@@ -2398,6 +2400,9 @@ type
       const AIndirectReference: IDerInteger;
       const ADataValueDescriptor: IAsn1ObjectDescriptor;
       AEncoding: Int32; const AExternalData: IAsn1Object); overload;
+
+      function GetEncoding(AEncoding: Int32): IAsn1Encoding; override;
+    function GetEncodingImplicit(AEncoding, ATagClass, ATagNo: Int32): IAsn1Encoding; override;
   end;
 
   /// <summary>
@@ -2415,10 +2420,6 @@ type
   strict protected
     function Asn1Equals(const AAsn1Object: IAsn1Object): Boolean; override;
     function Asn1GetHashCode(): Int32; override;
-    function GetEncoding(AEncoding: Int32): IAsn1Encoding; override;
-    function GetEncodingImplicit(AEncoding, ATagClass, ATagNo: Int32): IAsn1Encoding; override;
-    function GetEncodingDer(): IDerEncoding; override;
-    function GetEncodingDerImplicit(ATagClass, ATagNo: Int32): IDerEncoding; override;
   public
     type
       /// <summary>
@@ -2449,6 +2450,12 @@ type
     function GetValue(): Byte;
     function GetIsTrue(): Boolean;
     function ToString(): String; override;
+
+    function GetEncoding(AEncoding: Int32): IAsn1Encoding; override;
+    function GetEncodingImplicit(AEncoding, ATagClass, ATagNo: Int32): IAsn1Encoding; override;
+    function GetEncodingDer(): IDerEncoding; override;
+    function GetEncodingDerImplicit(ATagClass, ATagNo: Int32): IDerEncoding; override;
+
     class property False: IDerBoolean read GetFalse;
     class property True: IDerBoolean read GetTrue;
   end;
@@ -2472,10 +2479,6 @@ type
   strict protected
     function Asn1Equals(const AAsn1Object: IAsn1Object): Boolean; override;
     function Asn1GetHashCode(): Int32; override;
-    function GetEncoding(AEncoding: Int32): IAsn1Encoding; override;
-    function GetEncodingImplicit(AEncoding, ATagClass, ATagNo: Int32): IAsn1Encoding; override;
-    function GetEncodingDer(): IDerEncoding; override;
-    function GetEncodingDerImplicit(ATagClass, ATagNo: Int32): IDerEncoding; override;
   public
     type
       /// <summary>
@@ -2506,6 +2509,11 @@ type
     function GetBytes(): TCryptoLibByteArray;
     function HasValue(AX: Int32): Boolean; overload;
     function HasValue(const AX: TBigInteger): Boolean; overload;
+
+    function GetEncoding(AEncoding: Int32): IAsn1Encoding; override;
+    function GetEncodingImplicit(AEncoding, ATagClass, ATagNo: Int32): IAsn1Encoding; override;
+    function GetEncodingDer(): IDerEncoding; override;
+    function GetEncodingDerImplicit(ATagClass, ATagNo: Int32): IDerEncoding; override;
   end;
 
   /// <summary>
@@ -2552,12 +2560,13 @@ type
   strict protected
     function Asn1Equals(const AAsn1Object: IAsn1Object): Boolean; override;
     function Asn1GetHashCode(): Int32; override;
+  public
+    constructor Create;
     function GetEncoding(AEncoding: Int32): IAsn1Encoding; override;
     function GetEncodingImplicit(AEncoding, ATagClass, ATagNo: Int32): IAsn1Encoding; override;
     function GetEncodingDer(): IDerEncoding; override;
     function GetEncodingDerImplicit(ATagClass, ATagNo: Int32): IDerEncoding; override;
-  public
-    constructor Create;
+
     class property Instance: IDerNull read GetInstance;
   end;
 
@@ -2587,10 +2596,6 @@ type
   strict protected
     function Asn1Equals(const AAsn1Object: IAsn1Object): Boolean; override;
     function Asn1GetHashCode(): Int32; override;
-    function GetEncoding(AEncoding: Int32): IAsn1Encoding; override;
-    function GetEncodingImplicit(AEncoding, ATagClass, ATagNo: Int32): IAsn1Encoding; override;
-    function GetEncodingDer(): IDerEncoding; override;
-    function GetEncodingDerImplicit(ATagClass, ATagNo: Int32): IDerEncoding; override;
   public
     type
       /// <summary>
@@ -2625,6 +2630,11 @@ type
     function Branch(const ABranchID: String): IDerObjectIdentifier;
     function &On(const AStem: IDerObjectIdentifier): Boolean;
     function ToString(): String; override;
+
+    function GetEncoding(AEncoding: Int32): IAsn1Encoding; override;
+    function GetEncodingImplicit(AEncoding, ATagClass, ATagNo: Int32): IAsn1Encoding; override;
+    function GetEncodingDer(): IDerEncoding; override;
+    function GetEncodingDerImplicit(ATagClass, ATagNo: Int32): IDerEncoding; override;
   end;
 
   /// <summary>
@@ -2654,10 +2664,6 @@ type
   strict protected
     function Asn1Equals(const AAsn1Object: IAsn1Object): Boolean; override;
     function Asn1GetHashCode(): Int32; override;
-    function GetEncoding(AEncoding: Int32): IAsn1Encoding; override;
-    function GetEncodingImplicit(AEncoding, ATagClass, ATagNo: Int32): IAsn1Encoding; override;
-    function GetEncodingDer(): IDerEncoding; override;
-    function GetEncodingDerImplicit(ATagClass, ATagNo: Int32): IDerEncoding; override;
   public
     type
       /// <summary>
@@ -2694,6 +2700,11 @@ type
     function Branch(const ABranchID: String): IAsn1RelativeOid;
     function GetContents(): TCryptoLibByteArray;
     function ToString(): String; override;
+
+    function GetEncoding(AEncoding: Int32): IAsn1Encoding; override;
+    function GetEncodingImplicit(AEncoding, ATagClass, ATagNo: Int32): IAsn1Encoding; override;
+    function GetEncodingDer(): IDerEncoding; override;
+    function GetEncodingDerImplicit(ATagClass, ATagNo: Int32): IDerEncoding; override;
   end;
 
   /// <summary>
@@ -2713,10 +2724,6 @@ type
   strict protected
     function Asn1Equals(const AAsn1Object: IAsn1Object): Boolean; override;
     function Asn1GetHashCode(): Int32; override;
-    function GetEncoding(AEncoding: Int32): IAsn1Encoding; override;
-    function GetEncodingImplicit(AEncoding, ATagClass, ATagNo: Int32): IAsn1Encoding; override;
-    function GetEncodingDer(): IDerEncoding; override;
-    function GetEncodingDerImplicit(ATagClass, ATagNo: Int32): IDerEncoding; override;
   public
     type
       /// <summary>
@@ -2746,6 +2753,11 @@ type
     function GetContents(AEncoding: Int32): TCryptoLibByteArray;
     function GetTimeString: String;
     function ToDateTime: TDateTime;
+
+    function GetEncoding(AEncoding: Int32): IAsn1Encoding; override;
+    function GetEncodingImplicit(AEncoding, ATagClass, ATagNo: Int32): IAsn1Encoding; override;
+    function GetEncodingDer(): IDerEncoding; override;
+    function GetEncodingDerImplicit(ATagClass, ATagNo: Int32): IDerEncoding; override;
   end;
 
   /// <summary>
@@ -2765,10 +2777,6 @@ type
   strict protected
     function Asn1Equals(const AAsn1Object: IAsn1Object): Boolean; override;
     function Asn1GetHashCode(): Int32; override;
-    function GetEncoding(AEncoding: Int32): IAsn1Encoding; override;
-    function GetEncodingImplicit(AEncoding, ATagClass, ATagNo: Int32): IAsn1Encoding; override;
-    function GetEncodingDer(): IDerEncoding; override;
-    function GetEncodingDerImplicit(ATagClass, ATagNo: Int32): IDerEncoding; override;
   public
     type
       /// <summary>
@@ -2803,33 +2811,38 @@ type
     function ToDateTime: TDateTime; overload;
     function ToDateTime(ATwoDigitYearMax: Int32): TDateTime; overload;
     function ToAdjustedDateTime: TDateTime; deprecated 'Use ToDateTime(2049) instead';
+
+    function GetEncoding(AEncoding: Int32): IAsn1Encoding; override;
+    function GetEncodingImplicit(AEncoding, ATagClass, ATagNo: Int32): IAsn1Encoding; override;
+    function GetEncodingDer(): IDerEncoding; override;
+    function GetEncodingDerImplicit(ATagClass, ATagNo: Int32): IDerEncoding; override;
   end;
 
   /// <summary>
   /// DER UTC time implementation.
   /// </summary>
   TDerUtcTime = class(TAsn1UtcTime, IDerUtcTime)
-  strict protected
-    function GetEncoding(AEncoding: Int32): IAsn1Encoding; override;
-    function GetEncodingImplicit(AEncoding, ATagClass, ATagNo: Int32): IAsn1Encoding; override;
   public
     constructor Create(const ATimeString: String); overload;
     constructor Create(const ADateTime: TDateTime); overload; deprecated 'Use Create(DateTime, Int32) instead';
     constructor Create(const ADateTime: TDateTime; ATwoDigitYearMax: Int32); overload;
     constructor Create(const AContents: TCryptoLibByteArray); overload;
+
+    function GetEncoding(AEncoding: Int32): IAsn1Encoding; override;
+    function GetEncodingImplicit(AEncoding, ATagClass, ATagNo: Int32): IAsn1Encoding; override;
   end;
 
   /// <summary>
   /// DER generalized time implementation.
   /// </summary>
   TDerGeneralizedTime = class(TAsn1GeneralizedTime, IDerGeneralizedTime)
-  strict protected
-    function GetEncoding(AEncoding: Int32): IAsn1Encoding; override;
-    function GetEncodingImplicit(AEncoding, ATagClass, ATagNo: Int32): IAsn1Encoding; override;
   public
     constructor Create(const ATimeString: String); overload;
     constructor Create(const ADateTime: TDateTime); overload;
     constructor Create(const AContents: TCryptoLibByteArray); overload;
+
+    function GetEncoding(AEncoding: Int32): IAsn1Encoding; override;
+    function GetEncodingImplicit(AEncoding, ATagClass, ATagNo: Int32): IAsn1Encoding; override;
   end;
 
   /// <summary>
@@ -2841,10 +2854,6 @@ type
   strict protected
     function Asn1Equals(const AAsn1Object: IAsn1Object): Boolean; override;
     function Asn1GetHashCode(): Int32; override;
-    function GetEncoding(AEncoding: Int32): IAsn1Encoding; override;
-    function GetEncodingImplicit(AEncoding, ATagClass, ATagNo: Int32): IAsn1Encoding; override;
-    function GetEncodingDer(): IDerEncoding; override;
-    function GetEncodingDerImplicit(ATagClass, ATagNo: Int32): IDerEncoding; override;
   public
     type
       /// <summary>
@@ -2871,6 +2880,11 @@ type
     class function GetTagged(const ATaggedObject: IAsn1TaggedObject; ADeclaredExplicit: Boolean): IAsn1ObjectDescriptor; static;
     class function CreatePrimitive(const AContents: TCryptoLibByteArray): IAsn1Object; static;
     function GetGraphicString(): IAsn1Object;
+
+    function GetEncoding(AEncoding: Int32): IAsn1Encoding; override;
+    function GetEncodingImplicit(AEncoding, ATagClass, ATagNo: Int32): IAsn1Encoding; override;
+    function GetEncodingDer(): IDerEncoding; override;
+    function GetEncodingDerImplicit(ATagClass, ATagNo: Int32): IDerEncoding; override;
   end;
 
   /// <summary>
@@ -3130,10 +3144,6 @@ type
   strict protected
     function Asn1Equals(const AAsn1Object: IAsn1Object): Boolean; override;
     function Asn1GetHashCode(): Int32; override;
-    function GetEncoding(AEncoding: Int32): IAsn1Encoding; override;
-    function GetEncodingImplicit(AEncoding, ATagClass, ATagNo: Int32): IAsn1Encoding; override;
-    function GetEncodingDer(): IDerEncoding; override;
-    function GetEncodingDerImplicit(ATagClass, ATagNo: Int32): IDerEncoding; override;
   public
     const
       SignExtSigned = Int32(-1);
@@ -3286,6 +3296,11 @@ type
     class function IntValue(const ABytes: TCryptoLibByteArray; AStart, ASignExt: Int32): Int32; static;
     
     function ToString(): String; override;
+
+    function GetEncoding(AEncoding: Int32): IAsn1Encoding; override;
+    function GetEncodingImplicit(AEncoding, ATagClass, ATagNo: Int32): IAsn1Encoding; override;
+    function GetEncodingDer(): IDerEncoding; override;
+    function GetEncodingDerImplicit(ATagClass, ATagNo: Int32): IDerEncoding; override;
     
     property Value: TBigInteger read GetValue;
     property PositiveValue: TBigInteger read GetPositiveValue;
@@ -4240,7 +4255,6 @@ var
   LContentsOctets: TCryptoLibByteArray;
   LDefIn: TAsn1DefiniteLengthInputStream;
   LContentsElements: IAsn1EncodableVector;
-  LContentsElementsClass: TAsn1EncodableVector;
 begin
   if not AConstructed then
   begin
@@ -4258,7 +4272,6 @@ end;
 function TAsn1StreamParser.LoadTaggedIL(ATagClass, ATagNo: Int32): IAsn1Object;
 var
   LContentsElements: IAsn1EncodableVector;
-  LContentsElementsClass: TAsn1EncodableVector;
 begin
   LContentsElements := ReadVector();
   Result := TAsn1TaggedObject.CreateConstructedIL(ATagClass, ATagNo, LContentsElements);
@@ -5095,23 +5108,15 @@ begin
 end;
 
 function TAsn1TaggedObject.GetExplicitBaseTagged(): IAsn1TaggedObject;
-var
-  LObj: IAsn1Object;
-  LTagged: IAsn1TaggedObject;
 begin
   if not IsExplicit() then
     raise EInvalidOperationCryptoLibException.Create('object implicit - explicit expected.');
-  
-  LObj := FObject.ToAsn1Object();
-  if not Supports(LObj, IAsn1TaggedObject, LTagged) then
-    raise EInvalidOperationCryptoLibException.Create('unexpected object type');
-  
-  Result := LTagged;
+
+  Result := CheckedCast(FObject.ToAsn1Object());
 end;
 
 function TAsn1TaggedObject.GetImplicitBaseTagged(ABaseTagClass, ABaseTagNo: Int32): IAsn1TaggedObject;
 var
-  LObj: IAsn1Object;
   LTagged: IAsn1TaggedObject;
 begin
   if (TAsn1Tags.Universal = ABaseTagClass) or ((ABaseTagClass and TAsn1Tags.Private) <> ABaseTagClass) then
@@ -5122,10 +5127,7 @@ begin
       raise EInvalidOperationCryptoLibException.Create('object explicit - implicit expected.');
     DeclaredImplicit:
       begin
-        LObj := FObject.ToAsn1Object();
-        if not Supports(LObj, IAsn1TaggedObject, LTagged) then
-          raise EInvalidOperationCryptoLibException.Create('unexpected object type');
-        
+        LTagged := CheckedCast(FObject.ToAsn1Object());
         // Check tag using TAsn1Utilities
         Result := TAsn1Utilities.CheckTag(LTagged, ABaseTagClass, ABaseTagNo);
       end;
@@ -6311,6 +6313,7 @@ constructor TAsn1Set.Create();
 begin
   inherited Create;
   FElements := TAsn1EncodableVector.EmptyElements;
+  FSortedDerEncodings := nil;
 end;
 
 constructor TAsn1Set.Create(const AElement: IAsn1Encodable);
@@ -6320,6 +6323,7 @@ begin
     raise EArgumentNilCryptoLibException.Create('element');
   System.SetLength(FElements, 1);
   FElements[0] := AElement;
+  FSortedDerEncodings := nil;
 end;
 
 constructor TAsn1Set.Create(const AElements: array of IAsn1Encodable; ADoSort: Boolean);
@@ -6335,7 +6339,9 @@ begin
   for I := 0 to System.Length(AElements) - 1 do
     FElements[I] := AElements[I];
   if ADoSort and (System.Length(FElements) > 1) then
-    SortElements(FElements);
+    FSortedDerEncodings := SortElements(FElements)
+  else
+    FSortedDerEncodings := nil;
 end;
 
 constructor TAsn1Set.Create(const AElementVector: IAsn1EncodableVector; ADoSort: Boolean);
@@ -6346,10 +6352,13 @@ begin
   if ADoSort and (AElementVector.Count > 1) then
   begin
     FElements := AElementVector.CopyElements();
-    SortElements(FElements);
+    FSortedDerEncodings := SortElements(FElements);
   end
   else
+  begin
     FElements := AElementVector.TakeElements();
+    FSortedDerEncodings := nil;
+  end;
 end;
 
 constructor TAsn1Set.Create(const AC: TCryptoLibGenericArray<IAsn1Encodable>; ADoSort: Boolean);
@@ -6362,8 +6371,10 @@ begin
   System.SetLength(FElements, System.Length(AC));
   for I := 0 to System.Length(AC) - 1 do
     FElements[I] := AC[I];
-  if ADoSort then
-    SortElements(FElements);
+  if ADoSort and (System.Length(FElements) > 1) then
+    FSortedDerEncodings := SortElements(FElements)
+  else
+    FSortedDerEncodings := nil;
 end;
 
 constructor TAsn1Set.Create(const ASequence: IAsn1Sequence);
@@ -6378,6 +6389,7 @@ begin
   System.SetLength(FElements, System.Length(LElements));
   for I := 0 to System.Length(LElements) - 1 do
     FElements[I] := LElements[I];
+  FSortedDerEncodings := nil;
 end;
 
 constructor TAsn1Set.Create(const ASet: IAsn1Set);
@@ -6392,6 +6404,7 @@ begin
   System.SetLength(FElements, System.Length(LElements));
   for I := 0 to System.Length(LElements) - 1 do
     FElements[I] := LElements[I];
+  FSortedDerEncodings := nil;
 end;
 
 constructor TAsn1Set.Create(AIsSorted: Boolean; const AElements: TCryptoLibGenericArray<IAsn1Encodable>);
@@ -6399,10 +6412,10 @@ begin
   inherited Create;
   if AElements = nil then
     raise EArgumentNilCryptoLibException.Create('elements');
+
+  System.Assert(not AIsSorted);
   FElements := System.Copy(AElements);
-  // If isSorted is false, elements need to be sorted
-  if not AIsSorted and (System.Length(FElements) > 1) then
-    SortElements(FElements);
+  FSortedDerEncodings := nil;
 end;
 
 destructor TAsn1Set.Destroy;
@@ -6577,21 +6590,19 @@ begin
   Result := TAsn1Set.Meta.Instance.GetTagged(ATaggedObject, ADeclaredExplicit) as IAsn1Set;
 end;
 
-class procedure TAsn1Set.SortElements(const AElements: TCryptoLibGenericArray<IAsn1Encodable>);
+class function TAsn1Set.SortElements(const AElements: TCryptoLibGenericArray<IAsn1Encodable>): TCryptoLibGenericArray<IDerEncoding>;
 var
   LCount, I, J: Int32;
   LDerEncodings: TCryptoLibGenericArray<IDerEncoding>;
   LTemp: IAsn1Encodable;
   LTempEncoding: IDerEncoding;
 begin
-  LCount := System.Length(AElements);
-  if LCount <= 1 then
-    Exit;
-
   // Get DER encodings for each element
   LDerEncodings := TAsn1OutputStream.GetContentsEncodingsDer(AElements);
+  LCount := System.Length(LDerEncodings);
 
   // Sort elements based on DER encodings using insertion sort
+  // (handles 0 or 1 elements gracefully - loop simply doesn't execute)
   for I := 1 to LCount - 1 do
   begin
     J := I;
@@ -6608,6 +6619,8 @@ begin
       System.Dec(J);
     end;
   end;
+
+  Result := LDerEncodings;
 end;
 
 { TDerSet }
@@ -14789,11 +14802,6 @@ end;
 
 { TAsn1UniversalTypes }
 
-constructor TAsn1UniversalTypes.Create;
-begin
-  // Private constructor - static class
-end;
-
 class function TAsn1UniversalTypes.Get(ATagNo: Int32): IAsn1UniversalType;
 begin
   case ATagNo of
@@ -15023,7 +15031,7 @@ function TAsn1Set.Meta.FromImplicitConstructed(const ASequence: IAsn1Sequence):
 begin
   // For Set, we need to convert the sequence to a set
   // Set can be constructed from a Sequence
-  Result := TAsn1Set.Create(ASequence.Elements, False);
+  Result := ASequence.ToAsn1Set();
 end;
 
 { TAsn1Sequence.TAsn1SequenceParserImpl }

+ 1 - 1
CryptoLib/src/Asn1/ClpAsn1Streams.pas

@@ -1837,7 +1837,7 @@ end;
 class function TAsn1InputStream.CreateDerBmpString(const ADefIn
   : TAsn1DefiniteLengthInputStream): IAsn1Object;
 var
-  LRemainingBytes, LLength, LStringPos, LBufPos, I: Int32;
+  LRemainingBytes, LLength, LStringPos, LBufPos: Int32;
   LBuf: TCryptoLibByteArray;
   LStr: TCryptoLibCharArray;
 begin

+ 0 - 1
CryptoLib/src/Asn1/ClpAsn1Utilities.pas

@@ -219,7 +219,6 @@ type
 implementation
 
 uses
-  ClpAsn1Streams,
   ClpAsn1Objects;
 
 { TAsn1Utilities }

+ 0 - 1
CryptoLib/src/Crypto/Encodings/ClpPkcs1Encoding.pas

@@ -26,7 +26,6 @@ uses
   Math,
   ClpBits,
   ClpICipherParameters,
-  ClpIParametersWithRandom,
   ClpIAsymmetricKeyParameter,
   ClpIAsymmetricBlockCipher,
   ClpIPkcs1Encoding,

+ 1 - 3
CryptoLib/src/Crypto/Engines/ClpRsaBlindedEngine.pas

@@ -26,13 +26,11 @@ uses
   ClpBigInteger,
   ClpBigIntegers,
   ClpICipherParameters,
-  ClpIParametersWithRandom,
   ClpIRsaKeyParameters,
   ClpIRsaPrivateCrtKeyParameters,
   ClpIRsa,
   ClpIAsymmetricBlockCipher,
   ClpIRsaBlindedEngine,
-  ClpIRsaCoreEngine,
   ClpRsaCoreEngine,
   ClpISecureRandom,
   ClpSecureRandom,
@@ -140,7 +138,7 @@ function TRsaBlindedEngine.ProcessBlock(const inBuf: TCryptoLibByteArray;
 var
   input, output: TBigInteger;
   crtKey: IRsaPrivateCrtKeyParameters;
-  e, m, n: TBigInteger;
+  e, m: TBigInteger;
   r, blind, unblind: TBigInteger;
   blindedInput, blindedResult: TBigInteger;
 begin

+ 0 - 1
CryptoLib/src/Crypto/Generators/ClpRsaBlindingFactorGenerator.pas

@@ -27,7 +27,6 @@ uses
   ClpBigIntegers,
   ClpICipherParameters,
   ClpParameterUtilities,
-  ClpIParametersWithRandom,
   ClpIRsaKeyParameters,
   ClpIRsaBlindingFactorGenerator,
   ClpISecureRandom,

+ 5 - 0
CryptoLib/src/Interfaces/ClpIAsn1Objects.pas

@@ -30,6 +30,7 @@ type
   IAsn1Object = interface;
   IAsn1Sequence = interface;
   IAsn1UniversalType = interface;
+  IAsn1Set = interface;
 
   /// <summary>
   /// Interface for ASN.1 encoding operations.
@@ -990,6 +991,10 @@ type
     /// </summary>
     function ToAsn1External(): IDerExternal;
     /// <summary>
+    /// Convert to ASN.1 set.
+    /// </summary>
+    function ToAsn1Set(): IAsn1Set;
+    /// <summary>
     /// Convert to string representation.
     /// </summary>
     function ToString(): String;

+ 1 - 8
CryptoLib/src/Utils/ClpCollectionUtilities.pas

@@ -30,8 +30,6 @@ type
   /// Collection utility class with static methods.
   /// </summary>
   TCollectionUtilities = class sealed(TObject)
-  strict private
-    constructor Create;
   public
     /// <summary>
     /// Map an array or collection using a function.
@@ -46,18 +44,13 @@ type
     /// Convert a collection to a string representation using a converter function.
     /// </summary>
     class function ToString<T>(const AC: TCryptoLibGenericArray<T>;
-      const AConverter: TFunc<T, String>): String; overload; static;
+      const AConverter: TFunc<T, String>): String; reintroduce; overload; static;
   end;
 
 implementation
 
 { TCollectionUtilities }
 
-constructor TCollectionUtilities.Create;
-begin
-  raise ENotSupportedException.Create('TCollectionUtilities is a static class');
-end;
-
 class function TCollectionUtilities.Map<T, TResult>(const ATs: TCryptoLibGenericArray<T>;
   const AFunc: TFunc<T, TResult>): TCryptoLibGenericArray<TResult>;
 var

+ 0 - 19
CryptoLib/src/Utils/ClpDateTimeUtilities.pas

@@ -129,7 +129,6 @@ type
     class var FTransforms: TCryptoLibGenericArray<TTokenTransformFunc>;
     class constructor Create;
 
-    constructor Create;
   public
     /// <summary>
     /// Register a new transform function (appended to the chain).
@@ -156,8 +155,6 @@ type
   /// Reusable parsing utilities for strict date/time string parsing.
   /// </summary>
   TDateTimeParseHelper = class sealed
-  strict private
-    constructor Create;
   public
     /// <summary>
     /// Read an integer from a substring with strict validation.
@@ -190,7 +187,6 @@ type
   /// </summary>
   TDateTimeUtilities = class sealed(TObject)
   strict private
-    constructor Create;
 
     class var
       /// <summary>
@@ -426,11 +422,6 @@ begin
   end);
 end;
 
-constructor TDateTimeFormatTransformer.Create;
-begin
-  raise ENotSupportedException.Create('TDateTimeFormatTransformer is a static class');
-end;
-
 class procedure TDateTimeFormatTransformer.Register(const ATransform: TTokenTransformFunc);
 begin
   SetLength(FTransforms, System.Length(FTransforms) + 1);
@@ -476,11 +467,6 @@ end;
 
 { TDateTimeParseHelper }
 
-constructor TDateTimeParseHelper.Create;
-begin
-  raise ENotSupportedException.Create('TDateTimeParseHelper is a static class');
-end;
-
 class function TDateTimeParseHelper.ReadInt(
   const S: String; AIndex, ACount: Int32; out AValue: Int32): Boolean;
 var
@@ -567,11 +553,6 @@ begin
   FTwoDigitYearMax := 2049;
 end;
 
-constructor TDateTimeUtilities.Create;
-begin
-  raise ENotSupportedException.Create('TDateTimeUtilities is a static class');
-end;
-
 class function TDateTimeUtilities.DateTimeToUnixMs(const ADateTime: TDateTime): Int64;
 var
   LUtc: TDateTime;

+ 4 - 4
CryptoLib/src/Utils/ClpStreams.pas

@@ -91,7 +91,7 @@ type
 
   protected
     function GetSize: Int64; override;
-    function GetCanWrite: Boolean; virtual;
+    function GetCanWrite: Boolean; override;
 
   public
     constructor Create(const ABuffer: TCryptoLibByteArray; AIndex, ACount: Int32); overload;
@@ -182,9 +182,9 @@ type
     function Read(var ABuffer; ACount: LongInt): LongInt; override;
     function Write(const ABuffer; ACount: LongInt): LongInt; override;
 
-    function ReadByte: Int32; virtual;
-    procedure WriteByte(AValue: Byte); virtual;
-    procedure Flush; virtual;
+    function ReadByte: Int32; override;
+    procedure WriteByte(AValue: Byte); override;
+    procedure Flush; override;
 
     destructor Destroy; override;