Browse Source

refactor Argon2 interface

Ugochukwu Mmaduekwe 6 years ago
parent
commit
3576486cf5

+ 29 - 25
CryptoLib.Tests/src/Crypto/Argon2Tests.pas

@@ -55,13 +55,15 @@ type
     // multiplied by 8 to get it in bits
     // multiplied by 8 to get it in bits
     DEFAULT_OUTPUTLEN_IN_BITS = Int32(32 * 8);
     DEFAULT_OUTPUTLEN_IN_BITS = Int32(32 * 8);
 
 
-    procedure HashTestFromInternetDraft(AArgon2Type: TArgon2Type;
-      AArgon2Version: TArgon2Version; AIterations, AMemoryAsKB,
-      AParallelism: Int32; const AAdditional, ASecret, ASalt, APassword,
-      APasswordRef: String; AOutputLength: Int32);
-
-    procedure HashTestOthers(AArgon2Type: TArgon2Type;
-      AArgon2Version: TArgon2Version; AIterations, AMemory, AParallelism: Int32;
+    procedure HashTestFromInternetDraft(AArgon2Type: TCryptoLibArgon2Type;
+      AArgon2Version: TCryptoLibArgon2Version;
+      AIterations, AMemoryAsKB, AParallelism: Int32;
+      const AAdditional, ASecret, ASalt, APassword, APasswordRef: String;
+      AOutputLength: Int32);
+
+    procedure HashTestOthers(AArgon2Type: TCryptoLibArgon2Type;
+      AArgon2Version: TCryptoLibArgon2Version;
+      AIterations, AMemory, AParallelism: Int32;
       const APassword, ASalt, APasswordRef: String; AOutputLength: Int32);
       const APassword, ASalt, APasswordRef: String; AOutputLength: Int32);
 
 
   protected
   protected
@@ -79,8 +81,9 @@ implementation
 
 
 { TTestArgon2 }
 { TTestArgon2 }
 
 
-procedure TTestArgon2.HashTestFromInternetDraft(AArgon2Type: TArgon2Type;
-  AArgon2Version: TArgon2Version; AIterations, AMemoryAsKB, AParallelism: Int32;
+procedure TTestArgon2.HashTestFromInternetDraft(AArgon2Type
+  : TCryptoLibArgon2Type; AArgon2Version: TCryptoLibArgon2Version;
+  AIterations, AMemoryAsKB, AParallelism: Int32;
   const AAdditional, ASecret, ASalt, APassword, APasswordRef: String;
   const AAdditional, ASecret, ASalt, APassword, APasswordRef: String;
   AOutputLength: Int32);
   AOutputLength: Int32);
 var
 var
@@ -102,7 +105,7 @@ begin
 
 
   LArgon2Generator.Init(AArgon2Type, AArgon2Version, LPassword, LSalt, LSecret,
   LArgon2Generator.Init(AArgon2Type, AArgon2Version, LPassword, LSalt, LSecret,
     LAdditional, AIterations, AMemoryAsKB, AParallelism,
     LAdditional, AIterations, AMemoryAsKB, AParallelism,
-    TArgon2MemoryCostType.a2mctMemoryAsKB);
+    TCryptoLibArgon2MemoryCostType.MemoryAsKB);
 
 
   LActual := TConverters.ConvertBytesToHexString
   LActual := TConverters.ConvertBytesToHexString
     ((LArgon2Generator.GenerateDerivedMacParameters(AOutputLength)
     ((LArgon2Generator.GenerateDerivedMacParameters(AOutputLength)
@@ -115,8 +118,9 @@ begin
 
 
 end;
 end;
 
 
-procedure TTestArgon2.HashTestOthers(AArgon2Type: TArgon2Type;
-  AArgon2Version: TArgon2Version; AIterations, AMemory, AParallelism: Int32;
+procedure TTestArgon2.HashTestOthers(AArgon2Type: TCryptoLibArgon2Type;
+  AArgon2Version: TCryptoLibArgon2Version;
+  AIterations, AMemory, AParallelism: Int32;
   const APassword, ASalt, APasswordRef: String; AOutputLength: Int32);
   const APassword, ASalt, APasswordRef: String; AOutputLength: Int32);
 var
 var
   LArgon2Generator: IArgon2ParametersGenerator;
   LArgon2Generator: IArgon2ParametersGenerator;
@@ -135,7 +139,7 @@ begin
 
 
   LArgon2Generator.Init(AArgon2Type, AArgon2Version, LPassword, LSalt, Nil, Nil,
   LArgon2Generator.Init(AArgon2Type, AArgon2Version, LPassword, LSalt, Nil, Nil,
     AIterations, AMemory, AParallelism,
     AIterations, AMemory, AParallelism,
-    TArgon2MemoryCostType.a2mctMemoryPowOfTwo);
+    TCryptoLibArgon2MemoryCostType.MemoryPowOfTwo);
 
 
   LActual := TConverters.ConvertBytesToHexString
   LActual := TConverters.ConvertBytesToHexString
     ((LArgon2Generator.GenerateDerivedMacParameters(AOutputLength)
     ((LArgon2Generator.GenerateDerivedMacParameters(AOutputLength)
@@ -163,8 +167,8 @@ end;
 procedure TTestArgon2.TestVectorsFromInternetDraft;
 procedure TTestArgon2.TestVectorsFromInternetDraft;
 var
 var
   LAdditional, LSecret, LSalt, LPassword: String;
   LAdditional, LSecret, LSalt, LPassword: String;
-  Argon2Version: TArgon2Version;
-  Argon2Type: TArgon2Type;
+  Argon2Version: TCryptoLibArgon2Version;
+  Argon2Type: TCryptoLibArgon2Type;
 begin
 begin
 
 
   LAdditional := '040404040404040404040404';
   LAdditional := '040404040404040404040404';
@@ -173,23 +177,23 @@ begin
   LPassword :=
   LPassword :=
     '0101010101010101010101010101010101010101010101010101010101010101';
     '0101010101010101010101010101010101010101010101010101010101010101';
 
 
-  Argon2Version := TArgon2Version.a2vARGON2_VERSION_13;
+  Argon2Version := TCryptoLibArgon2Version.Argon2Version13;
 
 
-  Argon2Type := TArgon2Type.a2tARGON2_d;
+  Argon2Type := TCryptoLibArgon2Type.Argon2D;
 
 
   HashTestFromInternetDraft(Argon2Type, Argon2Version, 3, 32, 4, LAdditional,
   HashTestFromInternetDraft(Argon2Type, Argon2Version, 3, 32, 4, LAdditional,
     LSecret, LSalt, LPassword,
     LSecret, LSalt, LPassword,
     '512B391B6F1162975371D30919734294F868E3BE3984F3C1A13A4DB9FABE4ACB',
     '512B391B6F1162975371D30919734294F868E3BE3984F3C1A13A4DB9FABE4ACB',
     DEFAULT_OUTPUTLEN_IN_BITS);
     DEFAULT_OUTPUTLEN_IN_BITS);
 
 
-  Argon2Type := TArgon2Type.a2tARGON2_i;
+  Argon2Type := TCryptoLibArgon2Type.Argon2I;
 
 
   HashTestFromInternetDraft(Argon2Type, Argon2Version, 3, 32, 4, LAdditional,
   HashTestFromInternetDraft(Argon2Type, Argon2Version, 3, 32, 4, LAdditional,
     LSecret, LSalt, LPassword,
     LSecret, LSalt, LPassword,
     'C814D9D1DC7F37AA13F0D77F2494BDA1C8DE6B016DD388D29952A4C4672B6CE8',
     'C814D9D1DC7F37AA13F0D77F2494BDA1C8DE6B016DD388D29952A4C4672B6CE8',
     DEFAULT_OUTPUTLEN_IN_BITS);
     DEFAULT_OUTPUTLEN_IN_BITS);
 
 
-  Argon2Type := TArgon2Type.a2tARGON2_id;
+  Argon2Type := TCryptoLibArgon2Type.Argon2ID;
 
 
   HashTestFromInternetDraft(Argon2Type, Argon2Version, 3, 32, 4, LAdditional,
   HashTestFromInternetDraft(Argon2Type, Argon2Version, 3, 32, 4, LAdditional,
     LSecret, LSalt, LPassword,
     LSecret, LSalt, LPassword,
@@ -200,12 +204,12 @@ end;
 
 
 procedure TTestArgon2.TestOthers;
 procedure TTestArgon2.TestOthers;
 var
 var
-  Argon2Version: TArgon2Version;
-  Argon2Type: TArgon2Type;
+  Argon2Version: TCryptoLibArgon2Version;
+  Argon2Type: TCryptoLibArgon2Type;
 begin
 begin
 
 
-  Argon2Version := TArgon2Version.a2vARGON2_VERSION_10;
-  Argon2Type := TArgon2Type.a2tARGON2_i;
+  Argon2Version := TCryptoLibArgon2Version.Argon2Version10;
+  Argon2Type := TCryptoLibArgon2Type.Argon2I;
 
 
   // Multiple test cases for various input values
   // Multiple test cases for various input values
   HashTestOthers(Argon2Type, Argon2Version, 2, 16, 1, 'password', 'somesalt',
   HashTestOthers(Argon2Type, Argon2Version, 2, 16, 1, 'password', 'somesalt',
@@ -245,8 +249,8 @@ begin
     + '39FEBA4A9CD9CC5B4C798F2AAF70EB4BD044C8D148DECB569870DBD923430B82A083F284BEAE777812CCE18CDAC68EE8CCEF'
     + '39FEBA4A9CD9CC5B4C798F2AAF70EB4BD044C8D148DECB569870DBD923430B82A083F284BEAE777812CCE18CDAC68EE8CCEF'
     + 'C6EC9789F30A6B5A034591F51AF830F4', 112 * 8);
     + 'C6EC9789F30A6B5A034591F51AF830F4', 112 * 8);
 
 
-  Argon2Version := TArgon2Version.a2vARGON2_VERSION_13;
-  Argon2Type := TArgon2Type.a2tARGON2_i;
+  Argon2Version := TCryptoLibArgon2Version.Argon2Version13;
+  Argon2Type := TCryptoLibArgon2Type.Argon2I;
   // Multiple test cases for various input values
   // Multiple test cases for various input values
 
 
   HashTestOthers(Argon2Type, Argon2Version, 2, 16, 1, 'password', 'somesalt',
   HashTestOthers(Argon2Type, Argon2Version, 2, 16, 1, 'password', 'somesalt',

+ 33 - 14
CryptoLib/src/Crypto/Generators/ClpArgon2ParametersGenerator.pas

@@ -25,6 +25,7 @@ uses
 
 
   HlpIHashInfo,
   HlpIHashInfo,
   HlpHashFactory,
   HlpHashFactory,
+  HlpArgon2TypeAndVersion,
   HlpPBKDF_Argon2NotBuildInAdapter,
   HlpPBKDF_Argon2NotBuildInAdapter,
   ClpPbeParametersGenerator,
   ClpPbeParametersGenerator,
   ClpICipherParameters,
   ClpICipherParameters,
@@ -38,6 +39,7 @@ uses
 
 
 resourcestring
 resourcestring
   SArgon2TypeInvalid = 'Selected Argon2Type is Invalid';
   SArgon2TypeInvalid = 'Selected Argon2Type is Invalid';
+  SArgon2VersionInvalid = 'Selected Argon2Version is Invalid';
   SArgon2MemoryCostTypeInvalid = 'Selected Argon2MemoryCostType is Invalid';
   SArgon2MemoryCostTypeInvalid = 'Selected Argon2MemoryCostType is Invalid';
 
 
 type
 type
@@ -72,10 +74,10 @@ type
 
 
     destructor Destroy; override;
     destructor Destroy; override;
 
 
-    procedure Init(argon2Type: TArgon2Type; argon2Version: TArgon2Version;
-      const password, salt, secret, additional: TCryptoLibByteArray;
-      iterations, memory, parallelism: Int32;
-      memoryCostType: TArgon2MemoryCostType);
+    procedure Init(argon2Type: TCryptoLibArgon2Type;
+      argon2Version: TCryptoLibArgon2Version; const password, salt, secret,
+      additional: TCryptoLibByteArray; iterations, memory, parallelism: Int32;
+      memoryCostType: TCryptoLibArgon2MemoryCostType);
 
 
     /// <summary>
     /// <summary>
     /// Generate a key parameter derived from the password, salt, and
     /// Generate a key parameter derived from the password, salt, and
@@ -204,26 +206,27 @@ begin
   result := TParametersWithIV.Create(key, dKey, keySize, ivSize);
   result := TParametersWithIV.Create(key, dKey, keySize, ivSize);
 end;
 end;
 
 
-procedure TArgon2ParametersGenerator.Init(argon2Type: TArgon2Type;
-  argon2Version: TArgon2Version; const password, salt, secret,
+procedure TArgon2ParametersGenerator.Init(argon2Type: TCryptoLibArgon2Type;
+  argon2Version: TCryptoLibArgon2Version; const password, salt, secret,
   additional: TCryptoLibByteArray; iterations, memory, parallelism: Int32;
   additional: TCryptoLibByteArray; iterations, memory, parallelism: Int32;
-  memoryCostType: TArgon2MemoryCostType);
+  memoryCostType: TCryptoLibArgon2MemoryCostType);
 var
 var
   LArgon2ParametersBuilder: IArgon2ParametersBuilder;
   LArgon2ParametersBuilder: IArgon2ParametersBuilder;
+  LArgon2Version: TArgon2Version;
 begin
 begin
   FPassword := System.Copy(password);
   FPassword := System.Copy(password);
 
 
   case argon2Type of
   case argon2Type of
-    TArgon2Type.a2tARGON2_d:
+    TCryptoLibArgon2Type.Argon2D:
       begin
       begin
         LArgon2ParametersBuilder := TArgon2dParametersBuilder.Builder();
         LArgon2ParametersBuilder := TArgon2dParametersBuilder.Builder();
       end;
       end;
 
 
-    TArgon2Type.a2tARGON2_i:
+    TCryptoLibArgon2Type.Argon2I:
       begin
       begin
         LArgon2ParametersBuilder := TArgon2iParametersBuilder.Builder();
         LArgon2ParametersBuilder := TArgon2iParametersBuilder.Builder();
       end;
       end;
-    TArgon2Type.a2tARGON2_id:
+    TCryptoLibArgon2Type.Argon2ID:
       begin
       begin
         LArgon2ParametersBuilder := TArgon2idParametersBuilder.Builder();
         LArgon2ParametersBuilder := TArgon2idParametersBuilder.Builder();
       end
       end
@@ -233,18 +236,34 @@ begin
     end;
     end;
   end;
   end;
 
 
+  case argon2Version of
+    TCryptoLibArgon2Version.Argon2Version10:
+      begin
+        LArgon2Version := TArgon2Version.a2vARGON2_VERSION_10;
+      end;
+
+    TCryptoLibArgon2Version.Argon2Version13:
+      begin
+        LArgon2Version := TArgon2Version.a2vARGON2_VERSION_13;
+      end
+  else
+    begin
+      raise EArgumentCryptoLibException.CreateRes(@SArgon2VersionInvalid);
+    end;
+  end;
+
   case memoryCostType of
   case memoryCostType of
-    TArgon2MemoryCostType.a2mctMemoryAsKB:
+    TCryptoLibArgon2MemoryCostType.MemoryAsKB:
       begin
       begin
-        LArgon2ParametersBuilder.WithVersion(argon2Version).WithSalt(salt)
+        LArgon2ParametersBuilder.WithVersion(LArgon2Version).WithSalt(salt)
           .WithSecret(secret).WithAdditional(additional)
           .WithSecret(secret).WithAdditional(additional)
           .WithIterations(iterations).WithMemoryAsKB(memory)
           .WithIterations(iterations).WithMemoryAsKB(memory)
           .WithParallelism(parallelism);
           .WithParallelism(parallelism);
       end;
       end;
 
 
-    TArgon2MemoryCostType.a2mctMemoryPowOfTwo:
+    TCryptoLibArgon2MemoryCostType.MemoryPowOfTwo:
       begin
       begin
-        LArgon2ParametersBuilder.WithVersion(argon2Version).WithSalt(salt)
+        LArgon2ParametersBuilder.WithVersion(LArgon2Version).WithSalt(salt)
           .WithSecret(secret).WithAdditional(additional)
           .WithSecret(secret).WithAdditional(additional)
           .WithIterations(iterations).WithMemoryPowOfTwo(memory)
           .WithIterations(iterations).WithMemoryPowOfTwo(memory)
           .WithParallelism(parallelism);
           .WithParallelism(parallelism);

+ 7 - 7
CryptoLib/src/Interfaces/ClpIArgon2ParametersGenerator.pas

@@ -28,9 +28,9 @@ uses
 
 
 type
 type
 {$SCOPEDENUMS ON}
 {$SCOPEDENUMS ON}
-  TArgon2Type = HlpArgon2TypeAndVersion.TArgon2Type;
-  TArgon2Version = HlpArgon2TypeAndVersion.TArgon2Version;
-  TArgon2MemoryCostType = (a2mctMemoryAsKB, a2mctMemoryPowOfTwo);
+  TCryptoLibArgon2Type = (Argon2D = $00, Argon2I = $01, Argon2ID = $02);
+  TCryptoLibArgon2Version = (Argon2Version10 = $10, Argon2Version13 = $13);
+  TCryptoLibArgon2MemoryCostType = (MemoryAsKB, MemoryPowOfTwo);
 {$SCOPEDENUMS OFF}
 {$SCOPEDENUMS OFF}
 
 
 type
 type
@@ -38,10 +38,10 @@ type
 
 
     ['{0AC3D3A8-9422-405F-B0EE-6B7AE0F64F74}']
     ['{0AC3D3A8-9422-405F-B0EE-6B7AE0F64F74}']
 
 
-    procedure Init(argon2Type: TArgon2Type; argon2Version: TArgon2Version;
-      const password, salt, secret, additional: TCryptoLibByteArray;
-      iterations, memory, parallelism: Int32;
-      memoryCostType: TArgon2MemoryCostType);
+    procedure Init(argon2Type: TCryptoLibArgon2Type;
+      argon2Version: TCryptoLibArgon2Version; const password, salt, secret,
+      additional: TCryptoLibByteArray; iterations, memory, parallelism: Int32;
+      memoryCostType: TCryptoLibArgon2MemoryCostType);
 
 
   end;
   end;