argon2 2.0.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby.yml +70 -0
  3. data/.rubocop.yml +178 -5
  4. data/Changelog.md +10 -0
  5. data/Gemfile +2 -0
  6. data/README.md +29 -17
  7. data/Rakefile +2 -0
  8. data/Steepfile +16 -0
  9. data/argon2.gemspec +13 -7
  10. data/bin/console +5 -4
  11. data/bin/setup +6 -2
  12. data/bin/test +10 -0
  13. data/ext/argon2_wrap/argon_wrap.c +6 -0
  14. data/ext/argon2_wrap/extconf.rb +1 -0
  15. data/ext/argon2_wrap/libargon2_wrap.so +0 -0
  16. data/ext/argon2_wrap/test.c +0 -1
  17. data/ext/phc-winner-argon2/.gitignore +1 -0
  18. data/ext/phc-winner-argon2/Argon2.sln +2 -4
  19. data/ext/phc-winner-argon2/LICENSE +2 -2
  20. data/ext/phc-winner-argon2/Makefile +86 -18
  21. data/ext/phc-winner-argon2/README.md +3 -1
  22. data/ext/phc-winner-argon2/include/argon2.h +3 -3
  23. data/ext/phc-winner-argon2/libargon2.pc.in +18 -0
  24. data/ext/phc-winner-argon2/src/argon2.c +2 -2
  25. data/ext/phc-winner-argon2/src/bench.c +4 -4
  26. data/ext/phc-winner-argon2/src/blake2/blake2-impl.h +3 -3
  27. data/ext/phc-winner-argon2/src/blake2/blake2.h +2 -2
  28. data/ext/phc-winner-argon2/src/blake2/blake2b.c +2 -2
  29. data/ext/phc-winner-argon2/src/blake2/blamka-round-opt.h +2 -2
  30. data/ext/phc-winner-argon2/src/blake2/blamka-round-ref.h +2 -2
  31. data/ext/phc-winner-argon2/src/core.c +20 -6
  32. data/ext/phc-winner-argon2/src/core.h +2 -2
  33. data/ext/phc-winner-argon2/src/encoding.c +2 -2
  34. data/ext/phc-winner-argon2/src/encoding.h +2 -2
  35. data/ext/phc-winner-argon2/src/genkat.c +9 -3
  36. data/ext/phc-winner-argon2/src/genkat.h +2 -2
  37. data/ext/phc-winner-argon2/src/opt.c +2 -2
  38. data/ext/phc-winner-argon2/src/ref.c +2 -2
  39. data/ext/phc-winner-argon2/src/run.c +2 -2
  40. data/ext/phc-winner-argon2/src/test.c +2 -2
  41. data/ext/phc-winner-argon2/src/thread.c +2 -2
  42. data/ext/phc-winner-argon2/src/thread.h +2 -2
  43. data/ext/phc-winner-argon2/vs2015/Argon2Opt/Argon2Opt.vcxproj +11 -6
  44. data/ext/phc-winner-argon2/vs2015/Argon2OptBench/Argon2OptBench.vcxproj +11 -6
  45. data/ext/phc-winner-argon2/vs2015/Argon2OptDll/Argon2OptDll.vcxproj +11 -6
  46. data/ext/phc-winner-argon2/vs2015/Argon2OptGenKAT/Argon2OptGenKAT.vcxproj +11 -6
  47. data/ext/phc-winner-argon2/vs2015/Argon2OptTestCI/Argon2OptTestCI.vcxproj +16 -8
  48. data/ext/phc-winner-argon2/vs2015/Argon2Ref/Argon2Ref.vcxproj +25 -8
  49. data/ext/phc-winner-argon2/vs2015/Argon2RefBench/Argon2RefBench.vcxproj +11 -6
  50. data/ext/phc-winner-argon2/vs2015/Argon2RefDll/Argon2RefDll.vcxproj +11 -6
  51. data/ext/phc-winner-argon2/vs2015/Argon2RefGenKAT/Argon2RefGenKAT.vcxproj +11 -6
  52. data/ext/phc-winner-argon2/vs2015/Argon2RefTestCI/Argon2RefTestCI.vcxproj +11 -6
  53. data/lib/argon2/ffi_engine.rb +49 -17
  54. data/lib/argon2/hash_format.rb +49 -0
  55. data/lib/argon2/version.rb +1 -1
  56. data/lib/argon2.rb +19 -8
  57. data/sig/argon2.rbs +16 -0
  58. data/sig/constants.rbs +8 -0
  59. data/sig/version.rbs +4 -0
  60. metadata +59 -39
  61. data/.travis.yml +0 -14
  62. data/ext/argon2_wrap/tests +0 -0
  63. data/ext/phc-winner-argon2/libargon2.pc +0 -16
@@ -32,43 +32,44 @@
32
32
  <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
33
33
  </PropertyGroup>
34
34
  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
35
+ <!-- Set DefaultPlatformToolset to v100 (VS2010) if not defined -->
36
+ <PropertyGroup Label="EmptyDefaultPlatformToolset">
37
+ <DefaultPlatformToolset Condition=" '$(DefaultPlatformToolset)' == '' ">v100</DefaultPlatformToolset>
38
+ </PropertyGroup>
39
+ <PropertyGroup Label="PlatformToolset">
40
+ <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
41
+ </PropertyGroup>
35
42
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
36
43
  <ConfigurationType>DynamicLibrary</ConfigurationType>
37
44
  <UseDebugLibraries>true</UseDebugLibraries>
38
- <PlatformToolset>v140</PlatformToolset>
39
45
  <CharacterSet>MultiByte</CharacterSet>
40
46
  </PropertyGroup>
41
47
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
42
48
  <ConfigurationType>DynamicLibrary</ConfigurationType>
43
49
  <UseDebugLibraries>false</UseDebugLibraries>
44
- <PlatformToolset>v140</PlatformToolset>
45
50
  <WholeProgramOptimization>true</WholeProgramOptimization>
46
51
  <CharacterSet>MultiByte</CharacterSet>
47
52
  </PropertyGroup>
48
53
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseStatic|Win32'" Label="Configuration">
49
54
  <ConfigurationType>DynamicLibrary</ConfigurationType>
50
55
  <UseDebugLibraries>false</UseDebugLibraries>
51
- <PlatformToolset>v140</PlatformToolset>
52
56
  <WholeProgramOptimization>true</WholeProgramOptimization>
53
57
  <CharacterSet>MultiByte</CharacterSet>
54
58
  </PropertyGroup>
55
59
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
56
60
  <ConfigurationType>DynamicLibrary</ConfigurationType>
57
61
  <UseDebugLibraries>true</UseDebugLibraries>
58
- <PlatformToolset>v140</PlatformToolset>
59
62
  <CharacterSet>MultiByte</CharacterSet>
60
63
  </PropertyGroup>
61
64
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
62
65
  <ConfigurationType>DynamicLibrary</ConfigurationType>
63
66
  <UseDebugLibraries>false</UseDebugLibraries>
64
- <PlatformToolset>v140</PlatformToolset>
65
67
  <WholeProgramOptimization>true</WholeProgramOptimization>
66
68
  <CharacterSet>MultiByte</CharacterSet>
67
69
  </PropertyGroup>
68
70
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseStatic|x64'" Label="Configuration">
69
71
  <ConfigurationType>DynamicLibrary</ConfigurationType>
70
72
  <UseDebugLibraries>false</UseDebugLibraries>
71
- <PlatformToolset>v140</PlatformToolset>
72
73
  <WholeProgramOptimization>true</WholeProgramOptimization>
73
74
  <CharacterSet>MultiByte</CharacterSet>
74
75
  </PropertyGroup>
@@ -154,6 +155,7 @@
154
155
  <Link>
155
156
  <EnableCOMDATFolding>true</EnableCOMDATFolding>
156
157
  <OptimizeReferences>true</OptimizeReferences>
158
+ <GenerateDebugInformation>true</GenerateDebugInformation>
157
159
  </Link>
158
160
  </ItemDefinitionGroup>
159
161
  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseStatic|Win32'">
@@ -169,6 +171,7 @@
169
171
  <Link>
170
172
  <EnableCOMDATFolding>true</EnableCOMDATFolding>
171
173
  <OptimizeReferences>true</OptimizeReferences>
174
+ <GenerateDebugInformation>true</GenerateDebugInformation>
172
175
  </Link>
173
176
  </ItemDefinitionGroup>
174
177
  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
@@ -183,6 +186,7 @@
183
186
  <Link>
184
187
  <EnableCOMDATFolding>true</EnableCOMDATFolding>
185
188
  <OptimizeReferences>true</OptimizeReferences>
189
+ <GenerateDebugInformation>true</GenerateDebugInformation>
186
190
  </Link>
187
191
  </ItemDefinitionGroup>
188
192
  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseStatic|x64'">
@@ -198,6 +202,7 @@
198
202
  <Link>
199
203
  <EnableCOMDATFolding>true</EnableCOMDATFolding>
200
204
  <OptimizeReferences>true</OptimizeReferences>
205
+ <GenerateDebugInformation>true</GenerateDebugInformation>
201
206
  </Link>
202
207
  </ItemDefinitionGroup>
203
208
  <ItemGroup>
@@ -32,43 +32,44 @@
32
32
  <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
33
33
  </PropertyGroup>
34
34
  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
35
+ <!-- Set DefaultPlatformToolset to v100 (VS2010) if not defined -->
36
+ <PropertyGroup Label="EmptyDefaultPlatformToolset">
37
+ <DefaultPlatformToolset Condition=" '$(DefaultPlatformToolset)' == '' ">v100</DefaultPlatformToolset>
38
+ </PropertyGroup>
39
+ <PropertyGroup Label="PlatformToolset">
40
+ <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
41
+ </PropertyGroup>
35
42
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
36
43
  <ConfigurationType>Application</ConfigurationType>
37
44
  <UseDebugLibraries>true</UseDebugLibraries>
38
- <PlatformToolset>v140</PlatformToolset>
39
45
  <CharacterSet>MultiByte</CharacterSet>
40
46
  </PropertyGroup>
41
47
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
42
48
  <ConfigurationType>Application</ConfigurationType>
43
49
  <UseDebugLibraries>false</UseDebugLibraries>
44
- <PlatformToolset>v140</PlatformToolset>
45
50
  <WholeProgramOptimization>true</WholeProgramOptimization>
46
51
  <CharacterSet>MultiByte</CharacterSet>
47
52
  </PropertyGroup>
48
53
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseStatic|Win32'" Label="Configuration">
49
54
  <ConfigurationType>Application</ConfigurationType>
50
55
  <UseDebugLibraries>false</UseDebugLibraries>
51
- <PlatformToolset>v140</PlatformToolset>
52
56
  <WholeProgramOptimization>true</WholeProgramOptimization>
53
57
  <CharacterSet>MultiByte</CharacterSet>
54
58
  </PropertyGroup>
55
59
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
56
60
  <ConfigurationType>Application</ConfigurationType>
57
61
  <UseDebugLibraries>true</UseDebugLibraries>
58
- <PlatformToolset>v140</PlatformToolset>
59
62
  <CharacterSet>MultiByte</CharacterSet>
60
63
  </PropertyGroup>
61
64
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
62
65
  <ConfigurationType>Application</ConfigurationType>
63
66
  <UseDebugLibraries>false</UseDebugLibraries>
64
- <PlatformToolset>v140</PlatformToolset>
65
67
  <WholeProgramOptimization>true</WholeProgramOptimization>
66
68
  <CharacterSet>MultiByte</CharacterSet>
67
69
  </PropertyGroup>
68
70
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseStatic|x64'" Label="Configuration">
69
71
  <ConfigurationType>Application</ConfigurationType>
70
72
  <UseDebugLibraries>false</UseDebugLibraries>
71
- <PlatformToolset>v140</PlatformToolset>
72
73
  <WholeProgramOptimization>true</WholeProgramOptimization>
73
74
  <CharacterSet>MultiByte</CharacterSet>
74
75
  </PropertyGroup>
@@ -154,6 +155,7 @@
154
155
  <Link>
155
156
  <EnableCOMDATFolding>true</EnableCOMDATFolding>
156
157
  <OptimizeReferences>true</OptimizeReferences>
158
+ <GenerateDebugInformation>true</GenerateDebugInformation>
157
159
  </Link>
158
160
  </ItemDefinitionGroup>
159
161
  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseStatic|Win32'">
@@ -169,6 +171,7 @@
169
171
  <Link>
170
172
  <EnableCOMDATFolding>true</EnableCOMDATFolding>
171
173
  <OptimizeReferences>true</OptimizeReferences>
174
+ <GenerateDebugInformation>true</GenerateDebugInformation>
172
175
  </Link>
173
176
  </ItemDefinitionGroup>
174
177
  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
@@ -183,6 +186,7 @@
183
186
  <Link>
184
187
  <EnableCOMDATFolding>true</EnableCOMDATFolding>
185
188
  <OptimizeReferences>true</OptimizeReferences>
189
+ <GenerateDebugInformation>true</GenerateDebugInformation>
186
190
  </Link>
187
191
  </ItemDefinitionGroup>
188
192
  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseStatic|x64'">
@@ -198,6 +202,7 @@
198
202
  <Link>
199
203
  <EnableCOMDATFolding>true</EnableCOMDATFolding>
200
204
  <OptimizeReferences>true</OptimizeReferences>
205
+ <GenerateDebugInformation>true</GenerateDebugInformation>
201
206
  </Link>
202
207
  </ItemDefinitionGroup>
203
208
  <ItemGroup>
@@ -32,43 +32,44 @@
32
32
  <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
33
33
  </PropertyGroup>
34
34
  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
35
+ <!-- Set DefaultPlatformToolset to v100 (VS2010) if not defined -->
36
+ <PropertyGroup Label="EmptyDefaultPlatformToolset">
37
+ <DefaultPlatformToolset Condition=" '$(DefaultPlatformToolset)' == '' ">v100</DefaultPlatformToolset>
38
+ </PropertyGroup>
39
+ <PropertyGroup Label="PlatformToolset">
40
+ <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
41
+ </PropertyGroup>
35
42
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
36
43
  <ConfigurationType>Application</ConfigurationType>
37
44
  <UseDebugLibraries>true</UseDebugLibraries>
38
- <PlatformToolset>v140</PlatformToolset>
39
45
  <CharacterSet>MultiByte</CharacterSet>
40
46
  </PropertyGroup>
41
47
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
42
48
  <ConfigurationType>Application</ConfigurationType>
43
49
  <UseDebugLibraries>false</UseDebugLibraries>
44
- <PlatformToolset>v140</PlatformToolset>
45
50
  <WholeProgramOptimization>true</WholeProgramOptimization>
46
51
  <CharacterSet>MultiByte</CharacterSet>
47
52
  </PropertyGroup>
48
53
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseStatic|Win32'" Label="Configuration">
49
54
  <ConfigurationType>Application</ConfigurationType>
50
55
  <UseDebugLibraries>false</UseDebugLibraries>
51
- <PlatformToolset>v140</PlatformToolset>
52
56
  <WholeProgramOptimization>true</WholeProgramOptimization>
53
57
  <CharacterSet>MultiByte</CharacterSet>
54
58
  </PropertyGroup>
55
59
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
56
60
  <ConfigurationType>Application</ConfigurationType>
57
61
  <UseDebugLibraries>true</UseDebugLibraries>
58
- <PlatformToolset>v140</PlatformToolset>
59
62
  <CharacterSet>MultiByte</CharacterSet>
60
63
  </PropertyGroup>
61
64
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
62
65
  <ConfigurationType>Application</ConfigurationType>
63
66
  <UseDebugLibraries>false</UseDebugLibraries>
64
- <PlatformToolset>v140</PlatformToolset>
65
67
  <WholeProgramOptimization>true</WholeProgramOptimization>
66
68
  <CharacterSet>MultiByte</CharacterSet>
67
69
  </PropertyGroup>
68
70
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseStatic|x64'" Label="Configuration">
69
71
  <ConfigurationType>Application</ConfigurationType>
70
72
  <UseDebugLibraries>false</UseDebugLibraries>
71
- <PlatformToolset>v140</PlatformToolset>
72
73
  <WholeProgramOptimization>true</WholeProgramOptimization>
73
74
  <CharacterSet>MultiByte</CharacterSet>
74
75
  </PropertyGroup>
@@ -154,6 +155,7 @@
154
155
  <Link>
155
156
  <EnableCOMDATFolding>true</EnableCOMDATFolding>
156
157
  <OptimizeReferences>true</OptimizeReferences>
158
+ <GenerateDebugInformation>true</GenerateDebugInformation>
157
159
  </Link>
158
160
  </ItemDefinitionGroup>
159
161
  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseStatic|Win32'">
@@ -169,6 +171,7 @@
169
171
  <Link>
170
172
  <EnableCOMDATFolding>true</EnableCOMDATFolding>
171
173
  <OptimizeReferences>true</OptimizeReferences>
174
+ <GenerateDebugInformation>true</GenerateDebugInformation>
172
175
  </Link>
173
176
  </ItemDefinitionGroup>
174
177
  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
@@ -183,6 +186,7 @@
183
186
  <Link>
184
187
  <EnableCOMDATFolding>true</EnableCOMDATFolding>
185
188
  <OptimizeReferences>true</OptimizeReferences>
189
+ <GenerateDebugInformation>true</GenerateDebugInformation>
186
190
  </Link>
187
191
  </ItemDefinitionGroup>
188
192
  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseStatic|x64'">
@@ -198,6 +202,7 @@
198
202
  <Link>
199
203
  <EnableCOMDATFolding>true</EnableCOMDATFolding>
200
204
  <OptimizeReferences>true</OptimizeReferences>
205
+ <GenerateDebugInformation>true</GenerateDebugInformation>
201
206
  </Link>
202
207
  </ItemDefinitionGroup>
203
208
  <ItemGroup>
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'ffi'
2
4
  require 'ffi-compiler/loader'
3
5
 
@@ -5,29 +7,40 @@ module Argon2
5
7
  # Direct external bindings. Call these methods via the Engine class to ensure points are dealt with
6
8
  module Ext
7
9
  extend FFI::Library
8
- ffi_lib FFI::Compiler::Loader.find('argon2_wrap')
10
+ ffi_lib FFI::Compiler::Loader.find(FFI::Platform.windows? ? 'libargon2_wrap' : 'argon2_wrap')
9
11
 
10
12
  # int argon2i_hash_raw(const uint32_t t_cost, const uint32_t m_cost,
11
13
  # const uint32_t parallelism, const void *pwd,
12
14
  # const size_t pwdlen, const void *salt,
13
15
  # const size_t saltlen, void *hash, const size_t hashlen);
14
16
 
15
- attach_function :argon2i_hash_raw, [
16
- :uint, :uint, :uint, :pointer,
17
- :size_t, :pointer, :size_t, :pointer, :size_t], :int, :blocking => true
17
+ attach_function :argon2i_hash_raw, %i[
18
+ uint uint uint pointer
19
+ size_t pointer size_t pointer size_t
20
+ ], :int, :blocking => true
21
+
22
+ # int argon2id_hash_raw(const uint32_t t_cost, const uint32_t m_cost,
23
+ # const uint32_t parallelism, const void *pwd,
24
+ # const size_t pwdlen, const void *salt,
25
+ # const size_t saltlen, void *hash, const size_t hashlen)
26
+ attach_function :argon2id_hash_raw, %i[
27
+ uint uint uint pointer
28
+ size_t pointer size_t pointer size_t
29
+ ], :int, :blocking => true
18
30
 
19
31
  # void argon2_wrap(uint8_t *out, char *pwd, size_t pwdlen,
20
32
  # uint8_t *salt, uint32_t saltlen, uint32_t t_cost,
21
33
  # uint32_t m_cost, uint32_t lanes,
22
34
  # uint8_t *secret, uint32_t secretlen)
23
- attach_function :argon2_wrap, [
24
- :pointer, :pointer, :size_t, :pointer, :uint, :uint,
25
- :uint, :uint, :pointer, :size_t], :int, :blocking => true
35
+ attach_function :argon2_wrap, %i[
36
+ pointer pointer size_t pointer uint uint
37
+ uint uint pointer size_t
38
+ ], :int, :blocking => true
26
39
 
27
40
  # int argon2i_verify(const char *encoded, const void *pwd,
28
41
  # const size_t pwdlen);
29
- attach_function :wrap_argon2_verify, [:pointer, :pointer, :size_t,
30
- :pointer, :size_t], :int, :blocking => true
42
+ attach_function :wrap_argon2_verify, %i[pointer pointer size_t
43
+ pointer size_t], :int, :blocking => true
31
44
  end
32
45
 
33
46
  # The engine class shields users from the FFI interface.
@@ -36,29 +49,47 @@ module Argon2
36
49
  def self.hash_argon2i(password, salt, t_cost, m_cost, out_len = nil)
37
50
  out_len = (out_len || Constants::OUT_LEN).to_i
38
51
  raise ArgonHashFail, "Invalid output length" if out_len < 1
52
+
39
53
  result = ''
40
54
  FFI::MemoryPointer.new(:char, out_len) do |buffer|
41
55
  ret = Ext.argon2i_hash_raw(t_cost, 1 << m_cost, 1, password,
42
- password.length, salt, salt.length,
43
- buffer, out_len)
56
+ password.length, salt, salt.length,
57
+ buffer, out_len)
58
+ raise ArgonHashFail, ERRORS[ret.abs] unless ret.zero?
59
+
60
+ result = buffer.read_string(out_len)
61
+ end
62
+ result.unpack('H*').join
63
+ end
64
+
65
+ def self.hash_argon2id(password, salt, t_cost, m_cost, p_cost, out_len = nil)
66
+ out_len = (out_len || Constants::OUT_LEN).to_i
67
+ raise ArgonHashFail, "Invalid output length" if out_len < 1
68
+
69
+ result = ''
70
+ FFI::MemoryPointer.new(:char, out_len) do |buffer|
71
+ ret = Ext.argon2id_hash_raw(t_cost, 1 << m_cost, p_cost, password,
72
+ password.length, salt, salt.length,
73
+ buffer, out_len)
44
74
  raise ArgonHashFail, ERRORS[ret.abs] unless ret.zero?
75
+
45
76
  result = buffer.read_string(out_len)
46
77
  end
47
78
  result.unpack('H*').join
48
79
  end
49
80
 
50
- def self.hash_argon2id_encode(password, salt, t_cost, m_cost, secret)
81
+ def self.hash_argon2id_encode(password, salt, t_cost, m_cost, p_cost, secret)
51
82
  result = ''
52
83
  secretlen = secret.nil? ? 0 : secret.bytesize
53
84
  passwordlen = password.nil? ? 0 : password.bytesize
54
- if salt.length != Constants::SALT_LEN
55
- raise ArgonHashFail, "Invalid salt size"
56
- end
85
+ raise ArgonHashFail, "Invalid salt size" if salt.length != Constants::SALT_LEN
86
+
57
87
  FFI::MemoryPointer.new(:char, Constants::ENCODE_LEN) do |buffer|
58
88
  ret = Ext.argon2_wrap(buffer, password, passwordlen,
59
- salt, salt.length, t_cost, (1 << m_cost),
60
- 1, secret, secretlen)
89
+ salt, salt.length, t_cost, (1 << m_cost),
90
+ p_cost, secret, secretlen)
61
91
  raise ArgonHashFail, ERRORS[ret.abs] unless ret.zero?
92
+
62
93
  result = buffer.read_string(Constants::ENCODE_LEN)
63
94
  end
64
95
  result.delete "\0"
@@ -71,6 +102,7 @@ module Argon2
71
102
  ret = Ext.wrap_argon2_verify(hash, pwd, passwordlen, secret, secretlen)
72
103
  return false if ERRORS[ret.abs] == 'ARGON2_DECODING_FAIL'
73
104
  raise ArgonHashFail, ERRORS[ret.abs] unless ret.zero?
105
+
74
106
  true
75
107
  end
76
108
  end
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Argon2
4
+ ##
5
+ # Get the values from an Argon2 compatible string.
6
+ #
7
+ class HashFormat
8
+ attr_reader :variant, :version, :t_cost, :m_cost, :p_cost, :salt, :checksum
9
+
10
+ # FIXME: Reduce complexity/AbcSize
11
+ # rubocop:disable Metrics/AbcSize
12
+ def initialize(digest)
13
+ digest = digest.to_s unless digest.is_a?(String)
14
+
15
+ raise Argon2::ArgonHashFail, 'Invalid Argon2 hash' unless self.class.valid_hash?(digest)
16
+
17
+ _, variant, version, config, salt, checksum = digest.split('$')
18
+ # Regex magic to extract the values for each setting
19
+ version = /v=(\d+)/.match(version)
20
+ t_cost = /t=(\d+),/.match(config)
21
+ m_cost = /m=(\d+),/.match(config)
22
+ p_cost = /p=(\d+)/.match(config)
23
+
24
+ # Make sure none of the values are missing
25
+ raise Argon2::ArgonHashFail, 'Invalid Argon2 version' if version.nil?
26
+ raise Argon2::ArgonHashFail, 'Invalid Argon2 time cost' if t_cost.nil?
27
+ raise Argon2::ArgonHashFail, 'Invalid Argon2 memory cost' if m_cost.nil?
28
+ raise Argon2::ArgonHashFail, 'Invalid Argon2 parallelism cost' if p_cost.nil?
29
+
30
+ @variant = variant.to_str
31
+ @version = version[1].to_i
32
+ @t_cost = t_cost[1].to_i
33
+ @m_cost = m_cost[1].to_i
34
+ @p_cost = p_cost[1].to_i
35
+ @salt = salt.to_str
36
+ @checksum = checksum.to_str
37
+ end
38
+ # rubocop:enable Metrics/AbcSize
39
+
40
+ ##
41
+ # Checks whether a given digest is a valid Argon2 hash.
42
+ #
43
+ # Supports 1 and argon2id formats.
44
+ #
45
+ def self.valid_hash?(digest)
46
+ /^\$argon2(id?|d).{,113}/ =~ digest
47
+ end
48
+ end
49
+ end
@@ -3,5 +3,5 @@
3
3
  # Standard Gem version constant.
4
4
 
5
5
  module Argon2
6
- VERSION = "2.0.0".freeze
6
+ VERSION = "2.1.0"
7
7
  end
data/lib/argon2.rb CHANGED
@@ -4,7 +4,8 @@ require 'argon2/constants'
4
4
  require 'argon2/ffi_engine'
5
5
  require 'argon2/version'
6
6
  require 'argon2/errors'
7
- require 'argon2/engine.rb'
7
+ require 'argon2/engine'
8
+ require 'argon2/hash_format'
8
9
 
9
10
  module Argon2
10
11
  # Front-end API for the Argon2 module.
@@ -12,9 +13,14 @@ module Argon2
12
13
  def initialize(options = {})
13
14
  @t_cost = options[:t_cost] || 2
14
15
  raise ArgonHashFail, "Invalid t_cost" if @t_cost < 1 || @t_cost > 750
16
+
15
17
  @m_cost = options[:m_cost] || 16
16
18
  raise ArgonHashFail, "Invalid m_cost" if @m_cost < 1 || @m_cost > 31
17
- @salt = options[:salt_do_not_supply] || Engine.saltgen
19
+
20
+ @p_cost = options[:p_cost] || 1
21
+ raise ArgonHashFail, "Invalid p_cost" if @p_cost < 1 || @p_cost > 8
22
+
23
+ @insecure_salt = options[:salt_for_testing_purposes_only]
18
24
  @secret = options[:secret]
19
25
  end
20
26
 
@@ -22,20 +28,25 @@ module Argon2
22
28
  raise ArgonHashFail, "Invalid password (expected string)" unless
23
29
  pass.is_a?(String)
24
30
 
31
+ # Ensure salt is freshly generated unless it was intentionally supplied.
32
+ salt = @insecure_salt || Engine.saltgen
33
+
25
34
  Argon2::Engine.hash_argon2id_encode(
26
- pass, @salt, @t_cost, @m_cost, @secret)
35
+ pass, salt, @t_cost, @m_cost, @p_cost, @secret)
27
36
  end
28
37
 
29
38
  # Helper class, just creates defaults and calls hash()
30
- def self.create(pass)
31
- argon2 = Argon2::Password.new
39
+ def self.create(pass, options = {})
40
+ argon2 = Argon2::Password.new(options)
32
41
  argon2.create(pass)
33
42
  end
34
43
 
44
+ def self.valid_hash?(hash)
45
+ Argon2::HashFormat.valid_hash?(hash)
46
+ end
47
+
35
48
  def self.verify_password(pass, hash, secret = nil)
36
- # Supports argon2i and argon2id formats.
37
- raise ArgonHashFail, "Invalid hash" unless
38
- /^\$argon2i.{,113}/ =~ hash
49
+ raise ArgonHashFail, "Invalid hash" unless valid_hash?(hash)
39
50
 
40
51
  Argon2::Engine.argon2_verify(pass, hash, secret)
41
52
  end
data/sig/argon2.rbs ADDED
@@ -0,0 +1,16 @@
1
+ # Classes
2
+ module Argon2
3
+ class Password
4
+ @t_cost: Integer
5
+ @m_cost: Integer
6
+ @p_cost: Integer
7
+ @salt: nil | String
8
+ @secret: nil | String
9
+
10
+ def initialize: (?Hash[Symbol, Integer] options) -> (nil | String)
11
+ def create: (String pass) -> untyped
12
+ def self.create: (String pass) -> untyped
13
+ def self.valid_hash?: (string hash) -> Integer?
14
+ def self.verify_password: (untyped pass, untyped hash, ?nil secret) -> untyped
15
+ end
16
+ end
data/sig/constants.rbs ADDED
@@ -0,0 +1,8 @@
1
+ # Classes
2
+ module Argon2
3
+ module Constants
4
+ SALT_LEN: Integer
5
+ OUT_LEN: Integer
6
+ ENCODE_LEN: Integer
7
+ end
8
+ end
data/sig/version.rbs ADDED
@@ -0,0 +1,4 @@
1
+ # Classes
2
+ module Argon2
3
+ VERSION: String
4
+ end