|
@@ -27,6 +27,7 @@ uses
|
|
|
Generics.Collections,
|
|
Generics.Collections,
|
|
|
HlpHashFactory,
|
|
HlpHashFactory,
|
|
|
ClpIDigest,
|
|
ClpIDigest,
|
|
|
|
|
+ ClpDigest,
|
|
|
ClpPkcsObjectIdentifiers,
|
|
ClpPkcsObjectIdentifiers,
|
|
|
ClpRosstandartObjectIdentifiers,
|
|
ClpRosstandartObjectIdentifiers,
|
|
|
ClpOiwObjectIdentifiers,
|
|
ClpOiwObjectIdentifiers,
|
|
@@ -78,6 +79,11 @@ type
|
|
|
class function GetAlgorithmName(const oid: IDerObjectIdentifier): String;
|
|
class function GetAlgorithmName(const oid: IDerObjectIdentifier): String;
|
|
|
static; inline;
|
|
static; inline;
|
|
|
|
|
|
|
|
|
|
+ class function DoFinal(const digest: IDigest): TCryptoLibByteArray;
|
|
|
|
|
+ overload; static; inline;
|
|
|
|
|
+ class function DoFinal(const digest: IDigest; input: TCryptoLibByteArray)
|
|
|
|
|
+ : TCryptoLibByteArray; overload; static; inline;
|
|
|
|
|
+
|
|
|
class function CalculateDigest(const algorithm: String;
|
|
class function CalculateDigest(const algorithm: String;
|
|
|
input: TCryptoLibByteArray): TCryptoLibByteArray; static; inline;
|
|
input: TCryptoLibByteArray): TCryptoLibByteArray; static; inline;
|
|
|
|
|
|
|
@@ -123,226 +129,229 @@ begin
|
|
|
|
|
|
|
|
TDigestAlgorithm.BLAKE2B_160:
|
|
TDigestAlgorithm.BLAKE2B_160:
|
|
|
begin
|
|
begin
|
|
|
- result := IDigest(THashFactory.TCrypto.CreateBlake2B_160);
|
|
|
|
|
- result.Initialize;
|
|
|
|
|
|
|
+ result := TDigest.Create(THashFactory.TCrypto.CreateBlake2B_160);
|
|
|
|
|
+
|
|
|
Exit;
|
|
Exit;
|
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
TDigestAlgorithm.BLAKE2B_256:
|
|
TDigestAlgorithm.BLAKE2B_256:
|
|
|
begin
|
|
begin
|
|
|
- result := IDigest(THashFactory.TCrypto.CreateBlake2B_256);
|
|
|
|
|
- result.Initialize;
|
|
|
|
|
|
|
+ result := TDigest.Create(THashFactory.TCrypto.CreateBlake2B_256);
|
|
|
|
|
+
|
|
|
Exit;
|
|
Exit;
|
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
TDigestAlgorithm.BLAKE2B_384:
|
|
TDigestAlgorithm.BLAKE2B_384:
|
|
|
begin
|
|
begin
|
|
|
- result := IDigest(THashFactory.TCrypto.CreateBlake2B_384);
|
|
|
|
|
- result.Initialize;
|
|
|
|
|
|
|
+ result := TDigest.Create(THashFactory.TCrypto.CreateBlake2B_384);
|
|
|
|
|
+
|
|
|
Exit;
|
|
Exit;
|
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
TDigestAlgorithm.BLAKE2B_512:
|
|
TDigestAlgorithm.BLAKE2B_512:
|
|
|
begin
|
|
begin
|
|
|
- result := IDigest(THashFactory.TCrypto.CreateBlake2B_512);
|
|
|
|
|
- result.Initialize;
|
|
|
|
|
|
|
+ result := TDigest.Create(THashFactory.TCrypto.CreateBlake2B_512);
|
|
|
|
|
+
|
|
|
Exit;
|
|
Exit;
|
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
TDigestAlgorithm.BLAKE2S_128:
|
|
TDigestAlgorithm.BLAKE2S_128:
|
|
|
begin
|
|
begin
|
|
|
- result := IDigest(THashFactory.TCrypto.CreateBlake2S_128);
|
|
|
|
|
- result.Initialize;
|
|
|
|
|
|
|
+ result := TDigest.Create(THashFactory.TCrypto.CreateBlake2S_128);
|
|
|
|
|
+
|
|
|
Exit;
|
|
Exit;
|
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
TDigestAlgorithm.BLAKE2S_160:
|
|
TDigestAlgorithm.BLAKE2S_160:
|
|
|
begin
|
|
begin
|
|
|
- result := IDigest(THashFactory.TCrypto.CreateBlake2S_160);
|
|
|
|
|
- result.Initialize;
|
|
|
|
|
|
|
+ result := TDigest.Create(THashFactory.TCrypto.CreateBlake2S_160);
|
|
|
|
|
+
|
|
|
Exit;
|
|
Exit;
|
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
TDigestAlgorithm.BLAKE2S_224:
|
|
TDigestAlgorithm.BLAKE2S_224:
|
|
|
begin
|
|
begin
|
|
|
- result := IDigest(THashFactory.TCrypto.CreateBlake2S_224);
|
|
|
|
|
- result.Initialize;
|
|
|
|
|
|
|
+ result := TDigest.Create(THashFactory.TCrypto.CreateBlake2S_224);
|
|
|
|
|
+
|
|
|
Exit;
|
|
Exit;
|
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
TDigestAlgorithm.BLAKE2S_256:
|
|
TDigestAlgorithm.BLAKE2S_256:
|
|
|
begin
|
|
begin
|
|
|
- result := IDigest(THashFactory.TCrypto.CreateBlake2S_256);
|
|
|
|
|
- result.Initialize;
|
|
|
|
|
|
|
+ result := TDigest.Create(THashFactory.TCrypto.CreateBlake2S_256);
|
|
|
|
|
+
|
|
|
Exit;
|
|
Exit;
|
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
TDigestAlgorithm.GOST3411:
|
|
TDigestAlgorithm.GOST3411:
|
|
|
begin
|
|
begin
|
|
|
- result := IDigest(THashFactory.TCrypto.CreateGost());
|
|
|
|
|
- result.Initialize;
|
|
|
|
|
|
|
+ result := TDigest.Create(THashFactory.TCrypto.CreateGost());
|
|
|
|
|
+
|
|
|
Exit;
|
|
Exit;
|
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
TDigestAlgorithm.GOST3411_2012_256:
|
|
TDigestAlgorithm.GOST3411_2012_256:
|
|
|
begin
|
|
begin
|
|
|
- result := IDigest(THashFactory.TCrypto.CreateGOST3411_2012_256());
|
|
|
|
|
- result.Initialize;
|
|
|
|
|
|
|
+ result := TDigest.Create
|
|
|
|
|
+ (THashFactory.TCrypto.CreateGOST3411_2012_256());
|
|
|
|
|
+
|
|
|
Exit;
|
|
Exit;
|
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
TDigestAlgorithm.GOST3411_2012_512:
|
|
TDigestAlgorithm.GOST3411_2012_512:
|
|
|
begin
|
|
begin
|
|
|
- result := IDigest(THashFactory.TCrypto.CreateGOST3411_2012_512());
|
|
|
|
|
- result.Initialize;
|
|
|
|
|
|
|
+ result := TDigest.Create
|
|
|
|
|
+ (THashFactory.TCrypto.CreateGOST3411_2012_512());
|
|
|
|
|
+
|
|
|
Exit;
|
|
Exit;
|
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
TDigestAlgorithm.MD2:
|
|
TDigestAlgorithm.MD2:
|
|
|
begin
|
|
begin
|
|
|
- result := IDigest(THashFactory.TCrypto.CreateMD2());
|
|
|
|
|
- result.Initialize;
|
|
|
|
|
|
|
+ result := TDigest.Create(THashFactory.TCrypto.CreateMD2());
|
|
|
|
|
+
|
|
|
Exit;
|
|
Exit;
|
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
TDigestAlgorithm.MD4:
|
|
TDigestAlgorithm.MD4:
|
|
|
begin
|
|
begin
|
|
|
- result := IDigest(THashFactory.TCrypto.CreateMD4());
|
|
|
|
|
- result.Initialize;
|
|
|
|
|
|
|
+ result := TDigest.Create(THashFactory.TCrypto.CreateMD4());
|
|
|
|
|
+
|
|
|
Exit;
|
|
Exit;
|
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
TDigestAlgorithm.MD5:
|
|
TDigestAlgorithm.MD5:
|
|
|
begin
|
|
begin
|
|
|
- result := IDigest(THashFactory.TCrypto.CreateMD5());
|
|
|
|
|
- result.Initialize;
|
|
|
|
|
|
|
+ result := TDigest.Create(THashFactory.TCrypto.CreateMD5());
|
|
|
|
|
+
|
|
|
Exit;
|
|
Exit;
|
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
TDigestAlgorithm.NULL:
|
|
TDigestAlgorithm.NULL:
|
|
|
begin
|
|
begin
|
|
|
- result := IDigest(THashFactory.TNullDigestFactory.CreateNullDigest());
|
|
|
|
|
- result.Initialize;
|
|
|
|
|
|
|
+ result := TDigest.Create
|
|
|
|
|
+ (THashFactory.TNullDigestFactory.CreateNullDigest());
|
|
|
|
|
+
|
|
|
Exit;
|
|
Exit;
|
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
TDigestAlgorithm.RIPEMD128:
|
|
TDigestAlgorithm.RIPEMD128:
|
|
|
begin
|
|
begin
|
|
|
- result := IDigest(THashFactory.TCrypto.CreateRIPEMD128());
|
|
|
|
|
- result.Initialize;
|
|
|
|
|
|
|
+ result := TDigest.Create(THashFactory.TCrypto.CreateRIPEMD128());
|
|
|
|
|
+
|
|
|
Exit;
|
|
Exit;
|
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
TDigestAlgorithm.RIPEMD160:
|
|
TDigestAlgorithm.RIPEMD160:
|
|
|
begin
|
|
begin
|
|
|
- result := IDigest(THashFactory.TCrypto.CreateRIPEMD160());
|
|
|
|
|
- result.Initialize;
|
|
|
|
|
|
|
+ result := TDigest.Create(THashFactory.TCrypto.CreateRIPEMD160());
|
|
|
|
|
+
|
|
|
Exit;
|
|
Exit;
|
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
TDigestAlgorithm.RIPEMD256:
|
|
TDigestAlgorithm.RIPEMD256:
|
|
|
begin
|
|
begin
|
|
|
- result := IDigest(THashFactory.TCrypto.CreateRIPEMD256());
|
|
|
|
|
- result.Initialize;
|
|
|
|
|
|
|
+ result := TDigest.Create(THashFactory.TCrypto.CreateRIPEMD256());
|
|
|
|
|
+
|
|
|
Exit;
|
|
Exit;
|
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
TDigestAlgorithm.RIPEMD320:
|
|
TDigestAlgorithm.RIPEMD320:
|
|
|
begin
|
|
begin
|
|
|
- result := IDigest(THashFactory.TCrypto.CreateRIPEMD320());
|
|
|
|
|
- result.Initialize;
|
|
|
|
|
|
|
+ result := TDigest.Create(THashFactory.TCrypto.CreateRIPEMD320());
|
|
|
|
|
+
|
|
|
Exit;
|
|
Exit;
|
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
TDigestAlgorithm.SHA_1:
|
|
TDigestAlgorithm.SHA_1:
|
|
|
begin
|
|
begin
|
|
|
- result := IDigest(THashFactory.TCrypto.CreateSHA1());
|
|
|
|
|
- result.Initialize;
|
|
|
|
|
|
|
+ result := TDigest.Create(THashFactory.TCrypto.CreateSHA1());
|
|
|
|
|
+
|
|
|
Exit;
|
|
Exit;
|
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
TDigestAlgorithm.SHA_224:
|
|
TDigestAlgorithm.SHA_224:
|
|
|
begin
|
|
begin
|
|
|
- result := IDigest(THashFactory.TCrypto.CreateSHA2_224());
|
|
|
|
|
- result.Initialize;
|
|
|
|
|
|
|
+ result := TDigest.Create(THashFactory.TCrypto.CreateSHA2_224());
|
|
|
|
|
+
|
|
|
Exit;
|
|
Exit;
|
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
TDigestAlgorithm.SHA_256:
|
|
TDigestAlgorithm.SHA_256:
|
|
|
begin
|
|
begin
|
|
|
- result := IDigest(THashFactory.TCrypto.CreateSHA2_256());
|
|
|
|
|
- result.Initialize;
|
|
|
|
|
|
|
+ result := TDigest.Create(THashFactory.TCrypto.CreateSHA2_256());
|
|
|
|
|
+
|
|
|
Exit;
|
|
Exit;
|
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
TDigestAlgorithm.SHA_384:
|
|
TDigestAlgorithm.SHA_384:
|
|
|
begin
|
|
begin
|
|
|
- result := IDigest(THashFactory.TCrypto.CreateSHA2_384());
|
|
|
|
|
- result.Initialize;
|
|
|
|
|
|
|
+ result := TDigest.Create(THashFactory.TCrypto.CreateSHA2_384());
|
|
|
|
|
+
|
|
|
Exit;
|
|
Exit;
|
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
TDigestAlgorithm.SHA_512:
|
|
TDigestAlgorithm.SHA_512:
|
|
|
begin
|
|
begin
|
|
|
|
|
|
|
|
- result := IDigest(THashFactory.TCrypto.CreateSHA2_512());
|
|
|
|
|
- result.Initialize;
|
|
|
|
|
|
|
+ result := TDigest.Create(THashFactory.TCrypto.CreateSHA2_512());
|
|
|
|
|
+
|
|
|
Exit;
|
|
Exit;
|
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
TDigestAlgorithm.SHA_512_224:
|
|
TDigestAlgorithm.SHA_512_224:
|
|
|
begin
|
|
begin
|
|
|
- result := IDigest(THashFactory.TCrypto.CreateSHA2_512_224());
|
|
|
|
|
- result.Initialize;
|
|
|
|
|
|
|
+ result := TDigest.Create(THashFactory.TCrypto.CreateSHA2_512_224());
|
|
|
|
|
+
|
|
|
Exit;
|
|
Exit;
|
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
TDigestAlgorithm.SHA_512_256:
|
|
TDigestAlgorithm.SHA_512_256:
|
|
|
begin
|
|
begin
|
|
|
- result := IDigest(THashFactory.TCrypto.CreateSHA2_512_256());
|
|
|
|
|
- result.Initialize;
|
|
|
|
|
|
|
+ result := TDigest.Create(THashFactory.TCrypto.CreateSHA2_512_256());
|
|
|
|
|
+
|
|
|
Exit;
|
|
Exit;
|
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
TDigestAlgorithm.SHA3_224:
|
|
TDigestAlgorithm.SHA3_224:
|
|
|
begin
|
|
begin
|
|
|
- result := IDigest(THashFactory.TCrypto.CreateSHA3_224());
|
|
|
|
|
- result.Initialize;
|
|
|
|
|
|
|
+ result := TDigest.Create(THashFactory.TCrypto.CreateSHA3_224());
|
|
|
|
|
+
|
|
|
Exit;
|
|
Exit;
|
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
TDigestAlgorithm.SHA3_256:
|
|
TDigestAlgorithm.SHA3_256:
|
|
|
begin
|
|
begin
|
|
|
- result := IDigest(THashFactory.TCrypto.CreateSHA3_256());
|
|
|
|
|
- result.Initialize;
|
|
|
|
|
|
|
+ result := TDigest.Create(THashFactory.TCrypto.CreateSHA3_256());
|
|
|
|
|
+
|
|
|
Exit;
|
|
Exit;
|
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
TDigestAlgorithm.SHA3_384:
|
|
TDigestAlgorithm.SHA3_384:
|
|
|
begin
|
|
begin
|
|
|
- result := IDigest(THashFactory.TCrypto.CreateSHA3_384());
|
|
|
|
|
- result.Initialize;
|
|
|
|
|
|
|
+ result := TDigest.Create(THashFactory.TCrypto.CreateSHA3_384());
|
|
|
|
|
+
|
|
|
Exit;
|
|
Exit;
|
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
TDigestAlgorithm.SHA3_512:
|
|
TDigestAlgorithm.SHA3_512:
|
|
|
begin
|
|
begin
|
|
|
- result := IDigest(THashFactory.TCrypto.CreateSHA3_512());
|
|
|
|
|
- result.Initialize;
|
|
|
|
|
|
|
+ result := TDigest.Create(THashFactory.TCrypto.CreateSHA3_512());
|
|
|
|
|
+
|
|
|
Exit;
|
|
Exit;
|
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
TDigestAlgorithm.TIGER:
|
|
TDigestAlgorithm.TIGER:
|
|
|
begin
|
|
begin
|
|
|
- result := IDigest(THashFactory.TCrypto.CreateTiger_3_192);
|
|
|
|
|
- result.Initialize;
|
|
|
|
|
|
|
+ result := TDigest.Create(THashFactory.TCrypto.CreateTiger_3_192);
|
|
|
|
|
+
|
|
|
Exit;
|
|
Exit;
|
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
TDigestAlgorithm.WHIRLPOOL:
|
|
TDigestAlgorithm.WHIRLPOOL:
|
|
|
begin
|
|
begin
|
|
|
- result := IDigest(THashFactory.TCrypto.CreateWhirlPool);
|
|
|
|
|
- result.Initialize;
|
|
|
|
|
|
|
+ result := TDigest.Create(THashFactory.TCrypto.CreateWhirlPool);
|
|
|
|
|
+
|
|
|
Exit;
|
|
Exit;
|
|
|
end
|
|
end
|
|
|
else
|
|
else
|
|
@@ -458,14 +467,28 @@ begin
|
|
|
TRosstandartObjectIdentifiers.id_tc26_gost_3411_12_512);
|
|
TRosstandartObjectIdentifiers.id_tc26_gost_3411_12_512);
|
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
|
|
+class function TDigestUtilities.DoFinal(const digest: IDigest)
|
|
|
|
|
+ : TCryptoLibByteArray;
|
|
|
|
|
+begin
|
|
|
|
|
+ System.SetLength(result, digest.GetDigestSize());
|
|
|
|
|
+ digest.DoFinal(result, 0);
|
|
|
|
|
+end;
|
|
|
|
|
+
|
|
|
|
|
+class function TDigestUtilities.DoFinal(const digest: IDigest;
|
|
|
|
|
+ input: TCryptoLibByteArray): TCryptoLibByteArray;
|
|
|
|
|
+begin
|
|
|
|
|
+ digest.BlockUpdate(input, 0, System.Length(input));
|
|
|
|
|
+ result := DoFinal(digest);
|
|
|
|
|
+end;
|
|
|
|
|
+
|
|
|
class function TDigestUtilities.CalculateDigest(const algorithm: String;
|
|
class function TDigestUtilities.CalculateDigest(const algorithm: String;
|
|
|
input: TCryptoLibByteArray): TCryptoLibByteArray;
|
|
input: TCryptoLibByteArray): TCryptoLibByteArray;
|
|
|
var
|
|
var
|
|
|
digest: IDigest;
|
|
digest: IDigest;
|
|
|
begin
|
|
begin
|
|
|
digest := GetDigest(algorithm);
|
|
digest := GetDigest(algorithm);
|
|
|
- digest.TransformBytes(input, 0, System.Length(input));
|
|
|
|
|
- result := digest.TransformFinal().GetBytes();
|
|
|
|
|
|
|
+ digest.BlockUpdate(input, 0, System.Length(input));
|
|
|
|
|
+ result := DoFinal(digest);
|
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
class constructor TDigestUtilities.CreateDigestUtilities;
|
|
class constructor TDigestUtilities.CreateDigestUtilities;
|