argon2id 0.8.0.rc1-java → 0.10.0-java
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +39 -0
- data/README.md +5 -5
- data/Rakefile +2 -7
- data/argon2id.gemspec +2 -2
- data/lib/argon2id/extension.rb +1 -0
- data/lib/argon2id/password.rb +4 -3
- data/lib/argon2id/version.rb +1 -1
- data/test/argon2id/test_password.rb +67 -0
- metadata +7 -7
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: c752158cef0854ab64c00cd3346cc664f71f165cd020d66a7c89e7d1fc94cf95
|
|
4
|
+
data.tar.gz: ba733bbd6d58a4f0d38ce903fcb6394e4b3779d45351d6c4ba9a3b0833ad837d
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 01a4ca3f615bbf4a524892e1ec5ed168d01ba77624901488bf324ca23a2d2fc605d449cc7c5686b0a220d2999ef72b772e3c059802ea2a8dab8f5052a45f89c0
|
|
7
|
+
data.tar.gz: d5f4be4cb26348d7163a92dd1ee1fe9ff5a7064e5d3cc30c3ad0e689550f9325f482aa9afbe4bcbec7c44c6c4216274ea87a9148ff2cf5130e92e7132fd8c136
|
data/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,42 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [0.10.0] - 2026-04-06
|
|
9
|
+
|
|
10
|
+
### Changed
|
|
11
|
+
|
|
12
|
+
- Hashing and verifying passwords no longer holds the Ruby Global VM Lock
|
|
13
|
+
during the intentionally expensive computation of the Argon2id hash, allowing
|
|
14
|
+
other threads to do work at the same time.
|
|
15
|
+
- Argon2id::Password objects, their encoded password hash, salt, and hash
|
|
16
|
+
output strings are now all frozen to prevent mutation. Inputs are also now
|
|
17
|
+
frozen ASAP during hashing and verification to prevent mutation before
|
|
18
|
+
passing to the internal C/Java implementation of Argon2.
|
|
19
|
+
- The extension is now flagged as safe to use with Ractors.
|
|
20
|
+
|
|
21
|
+
## [0.9.0] - 2025-12-30
|
|
22
|
+
|
|
23
|
+
### Added
|
|
24
|
+
- Add support for Ruby 4.0 in precompiled, native gems.
|
|
25
|
+
|
|
26
|
+
### Removed
|
|
27
|
+
- Remove support and native gems for Ruby 2.6, 2.7, and 3.0.
|
|
28
|
+
- Remove native gems for 32-bit platforms, specifically x86-linux-gnu,
|
|
29
|
+
x86-linux-musl, and x86-mingw32
|
|
30
|
+
|
|
31
|
+
## [0.8.0] - 2024-12-29
|
|
32
|
+
|
|
33
|
+
### Added
|
|
34
|
+
|
|
35
|
+
- Add Ruby 3.4 support to the precompiled, native gems
|
|
36
|
+
- Restored support for Ruby 2.6, 2.7, and 3.0 after dropping them in 0.8.0.rc1
|
|
37
|
+
|
|
38
|
+
### Changed
|
|
39
|
+
|
|
40
|
+
- Provide separate precompiled, native gems for GNU and Musl
|
|
41
|
+
- Require glibc 2.29+ for x86-linux-gnu and x86_64-linux-gnu (and recommend
|
|
42
|
+
RubyGems 3.3.22+ and Bundler 2.3.21+)
|
|
43
|
+
|
|
8
44
|
## [0.8.0.rc1] - 2024-12-16
|
|
9
45
|
|
|
10
46
|
### Added
|
|
@@ -128,6 +164,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
128
164
|
reference C implementation of Argon2, the password-hashing function that won
|
|
129
165
|
the Password Hashing Competition.
|
|
130
166
|
|
|
167
|
+
[0.10.0]: https://github.com/mudge/argon2id/releases/tag/v0.10.0
|
|
168
|
+
[0.9.0]: https://github.com/mudge/argon2id/releases/tag/v0.9.0
|
|
169
|
+
[0.8.0]: https://github.com/mudge/argon2id/releases/tag/v0.8.0
|
|
131
170
|
[0.8.0.rc1]: https://github.com/mudge/argon2id/releases/tag/v0.8.0.rc1
|
|
132
171
|
[0.7.0]: https://github.com/mudge/argon2id/releases/tag/v0.7.0
|
|
133
172
|
[0.6.0]: https://github.com/mudge/argon2id/releases/tag/v0.6.0
|
data/README.md
CHANGED
|
@@ -5,7 +5,7 @@ Ruby bindings to [Argon2][], the password-hashing function that won the 2015
|
|
|
5
5
|
|
|
6
6
|
[](https://github.com/mudge/argon2id/actions)
|
|
7
7
|
|
|
8
|
-
**Current version:** 0.
|
|
8
|
+
**Current version:** 0.10.0
|
|
9
9
|
**Bundled Argon2 version:** libargon2.1 (20190702)
|
|
10
10
|
|
|
11
11
|
```ruby
|
|
@@ -257,8 +257,8 @@ User.find_by(name: "alice")&.authenticate("password") #=> user
|
|
|
257
257
|
|
|
258
258
|
This gem requires any of the following to run:
|
|
259
259
|
|
|
260
|
-
* [Ruby](https://www.ruby-lang.org/en/) 3.1 to
|
|
261
|
-
* [JRuby](https://www.jruby.org) 9.4
|
|
260
|
+
* [Ruby](https://www.ruby-lang.org/en/) 3.1 to 4.0
|
|
261
|
+
* [JRuby](https://www.jruby.org) 9.4 to 10.0
|
|
262
262
|
* [TruffleRuby](https://www.graalvm.org/ruby/) 24.1
|
|
263
263
|
|
|
264
264
|
> [!NOTE]
|
|
@@ -271,10 +271,10 @@ This gem requires any of the following to run:
|
|
|
271
271
|
Where possible, a pre-compiled native gem will be provided for the following platforms:
|
|
272
272
|
|
|
273
273
|
* Linux
|
|
274
|
-
* `aarch64-linux`, `arm-linux`, `
|
|
274
|
+
* `aarch64-linux`, `arm-linux`, `x86_64-linux` (requires [glibc](https://www.gnu.org/software/libc/) 2.29+, RubyGems 3.3.22+ and Bundler 2.3.21+)
|
|
275
275
|
* [musl](https://musl.libc.org/)-based systems such as [Alpine](https://alpinelinux.org) are supported with Bundler 2.5.6+
|
|
276
276
|
* macOS `x86_64-darwin` and `arm64-darwin`
|
|
277
|
-
* Windows `x64-mingw-ucrt`
|
|
277
|
+
* Windows 2022+ `x64-mingw-ucrt`
|
|
278
278
|
* Java: any platform running JRuby 9.4 or higher
|
|
279
279
|
|
|
280
280
|
### Verifying the gems
|
data/Rakefile
CHANGED
|
@@ -11,16 +11,12 @@ cross_platforms = %w[
|
|
|
11
11
|
arm-linux-musl
|
|
12
12
|
arm64-darwin
|
|
13
13
|
x64-mingw-ucrt
|
|
14
|
-
x64-mingw32
|
|
15
|
-
x86-linux-gnu
|
|
16
|
-
x86-linux-musl
|
|
17
|
-
x86-mingw32
|
|
18
14
|
x86_64-darwin
|
|
19
15
|
x86_64-linux-gnu
|
|
20
16
|
x86_64-linux-musl
|
|
21
17
|
].freeze
|
|
22
18
|
|
|
23
|
-
|
|
19
|
+
RakeCompilerDock.set_ruby_cc_version("~> 3.1", "~> 4.0")
|
|
24
20
|
|
|
25
21
|
gemspec = Gem::Specification.load("argon2id.gemspec")
|
|
26
22
|
|
|
@@ -31,7 +27,6 @@ namespace :java do
|
|
|
31
27
|
java_gemspec.files.reject! { |path| File.fnmatch?("ext/*", path) }
|
|
32
28
|
java_gemspec.extensions.clear
|
|
33
29
|
java_gemspec.platform = Gem::Platform.new("java")
|
|
34
|
-
java_gemspec.required_ruby_version = ">= 3.1.0"
|
|
35
30
|
|
|
36
31
|
Gem::PackageTask.new(java_gemspec).define
|
|
37
32
|
end
|
|
@@ -60,7 +55,7 @@ namespace :gem do
|
|
|
60
55
|
task platform do
|
|
61
56
|
RakeCompilerDock.sh <<~SCRIPT, platform: platform, verbose: true
|
|
62
57
|
gem install bundler --no-document &&
|
|
63
|
-
bundle &&
|
|
58
|
+
bundle install &&
|
|
64
59
|
bundle exec rake native:#{platform} pkg/#{gemspec.full_name}-#{Gem::Platform.new(platform)}.gem PATH="/usr/local/bin:$PATH"
|
|
65
60
|
SCRIPT
|
|
66
61
|
end
|
data/argon2id.gemspec
CHANGED
|
@@ -53,7 +53,7 @@ Gem::Specification.new do |s|
|
|
|
53
53
|
]
|
|
54
54
|
s.rdoc_options = ["--main", "README.md"]
|
|
55
55
|
|
|
56
|
-
s.add_development_dependency("rake-compiler", "~> 1.
|
|
57
|
-
s.add_development_dependency("rake-compiler-dock", "~> 1.
|
|
56
|
+
s.add_development_dependency("rake-compiler", "~> 1.3")
|
|
57
|
+
s.add_development_dependency("rake-compiler-dock", "~> 1.11")
|
|
58
58
|
s.add_development_dependency("minitest", "~> 5.25")
|
|
59
59
|
end
|
data/lib/argon2id/extension.rb
CHANGED
|
@@ -10,6 +10,7 @@ if RUBY_PLATFORM == "java"
|
|
|
10
10
|
class Password
|
|
11
11
|
def self.hash_encoded(t_cost, m_cost, parallelism, pwd, salt, hashlen)
|
|
12
12
|
raise Error, "Salt is too short" if salt.empty?
|
|
13
|
+
raise Error, "Memory cost is too small" if m_cost < 8
|
|
13
14
|
|
|
14
15
|
salt_bytes = salt.to_java_bytes
|
|
15
16
|
output = Java::byte[hashlen].new
|
data/lib/argon2id/password.rb
CHANGED
|
@@ -115,13 +115,14 @@ module Argon2id
|
|
|
115
115
|
def initialize(encoded)
|
|
116
116
|
raise ArgumentError, "invalid hash" unless PATTERN =~ String(encoded)
|
|
117
117
|
|
|
118
|
-
@encoded =
|
|
118
|
+
@encoded = $&.freeze
|
|
119
119
|
@version = Integer($1 || 0x10)
|
|
120
120
|
@m_cost = Integer($2)
|
|
121
121
|
@t_cost = Integer($3)
|
|
122
122
|
@parallelism = Integer($4)
|
|
123
|
-
@salt = $5.unpack1("m")
|
|
124
|
-
@output = $6.unpack1("m")
|
|
123
|
+
@salt = $5.unpack1("m").freeze
|
|
124
|
+
@output = $6.unpack1("m").freeze
|
|
125
|
+
freeze
|
|
125
126
|
end
|
|
126
127
|
|
|
127
128
|
# Return the encoded password hash.
|
data/lib/argon2id/version.rb
CHANGED
|
@@ -188,6 +188,42 @@ class TestPassword < Minitest::Test
|
|
|
188
188
|
assert password == "password"
|
|
189
189
|
end
|
|
190
190
|
|
|
191
|
+
def test_new_password_is_frozen
|
|
192
|
+
password = Argon2id::Password.new(
|
|
193
|
+
"$argon2id$v=19$m=256,t=2,p=1$c29tZXNhbHQ" \
|
|
194
|
+
"$nf65EOgLrQMR/uIPnA4rEsF5h7TKyQwu9U1bMCHGi/4"
|
|
195
|
+
)
|
|
196
|
+
|
|
197
|
+
assert password.frozen?
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
def test_encoded_is_frozen
|
|
201
|
+
password = Argon2id::Password.new(
|
|
202
|
+
"$argon2id$v=19$m=256,t=2,p=1$c29tZXNhbHQ" \
|
|
203
|
+
"$nf65EOgLrQMR/uIPnA4rEsF5h7TKyQwu9U1bMCHGi/4"
|
|
204
|
+
)
|
|
205
|
+
|
|
206
|
+
assert password.encoded.frozen?
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
def test_salt_is_frozen
|
|
210
|
+
password = Argon2id::Password.new(
|
|
211
|
+
"$argon2id$v=19$m=256,t=2,p=1$c29tZXNhbHQ" \
|
|
212
|
+
"$nf65EOgLrQMR/uIPnA4rEsF5h7TKyQwu9U1bMCHGi/4"
|
|
213
|
+
)
|
|
214
|
+
|
|
215
|
+
assert password.salt.frozen?
|
|
216
|
+
end
|
|
217
|
+
|
|
218
|
+
def test_output_is_frozen
|
|
219
|
+
password = Argon2id::Password.new(
|
|
220
|
+
"$argon2id$v=19$m=256,t=2,p=1$c29tZXNhbHQ" \
|
|
221
|
+
"$nf65EOgLrQMR/uIPnA4rEsF5h7TKyQwu9U1bMCHGi/4"
|
|
222
|
+
)
|
|
223
|
+
|
|
224
|
+
assert password.output.frozen?
|
|
225
|
+
end
|
|
226
|
+
|
|
191
227
|
def test_encoded_returns_the_full_encoded_hash
|
|
192
228
|
password = Argon2id::Password.new(
|
|
193
229
|
"$argon2id$v=19$m=256,t=2,p=1$c29tZXNhbHQ" \
|
|
@@ -526,6 +562,12 @@ class TestPassword < Minitest::Test
|
|
|
526
562
|
Argon2id.output_len = Argon2id::DEFAULT_OUTPUT_LEN
|
|
527
563
|
end
|
|
528
564
|
|
|
565
|
+
def test_create_password_is_frozen
|
|
566
|
+
password = Argon2id::Password.create("password")
|
|
567
|
+
|
|
568
|
+
assert password.frozen?
|
|
569
|
+
end
|
|
570
|
+
|
|
529
571
|
def test_create_password_equals_correct_password
|
|
530
572
|
password = Argon2id::Password.create("password")
|
|
531
573
|
|
|
@@ -538,6 +580,31 @@ class TestPassword < Minitest::Test
|
|
|
538
580
|
refute password == "differentpassword"
|
|
539
581
|
end
|
|
540
582
|
|
|
583
|
+
def test_create_is_thread_safe
|
|
584
|
+
threads = 10.times.map do |i|
|
|
585
|
+
Thread.new(i) do |n|
|
|
586
|
+
password = Argon2id::Password.create("password-#{n}", t_cost: 2, m_cost: 256, parallelism: 1)
|
|
587
|
+
assert password == "password-#{n}"
|
|
588
|
+
end
|
|
589
|
+
end
|
|
590
|
+
|
|
591
|
+
threads.each(&:value)
|
|
592
|
+
end
|
|
593
|
+
|
|
594
|
+
def test_verify_is_thread_safe
|
|
595
|
+
hash = Argon2id::Password.create("password", t_cost: 2, m_cost: 256, parallelism: 1).to_s
|
|
596
|
+
|
|
597
|
+
threads = 10.times.map do |i|
|
|
598
|
+
Thread.new do
|
|
599
|
+
password = Argon2id::Password.new(hash)
|
|
600
|
+
assert password == "password"
|
|
601
|
+
refute password == "wrong"
|
|
602
|
+
end
|
|
603
|
+
end
|
|
604
|
+
|
|
605
|
+
threads.each(&:value)
|
|
606
|
+
end
|
|
607
|
+
|
|
541
608
|
def test_hashing_password_verifies_correct_password
|
|
542
609
|
hash = Argon2id::Password.create("password").to_s
|
|
543
610
|
password = Argon2id::Password.new(hash)
|
metadata
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: argon2id
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.10.0
|
|
5
5
|
platform: java
|
|
6
6
|
authors:
|
|
7
7
|
- Paul Mucur
|
|
8
8
|
bindir: bin
|
|
9
9
|
cert_chain: []
|
|
10
|
-
date:
|
|
10
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
|
11
11
|
dependencies:
|
|
12
12
|
- !ruby/object:Gem::Dependency
|
|
13
13
|
name: rake-compiler
|
|
@@ -15,28 +15,28 @@ dependencies:
|
|
|
15
15
|
requirements:
|
|
16
16
|
- - "~>"
|
|
17
17
|
- !ruby/object:Gem::Version
|
|
18
|
-
version: '1.
|
|
18
|
+
version: '1.3'
|
|
19
19
|
type: :development
|
|
20
20
|
prerelease: false
|
|
21
21
|
version_requirements: !ruby/object:Gem::Requirement
|
|
22
22
|
requirements:
|
|
23
23
|
- - "~>"
|
|
24
24
|
- !ruby/object:Gem::Version
|
|
25
|
-
version: '1.
|
|
25
|
+
version: '1.3'
|
|
26
26
|
- !ruby/object:Gem::Dependency
|
|
27
27
|
name: rake-compiler-dock
|
|
28
28
|
requirement: !ruby/object:Gem::Requirement
|
|
29
29
|
requirements:
|
|
30
30
|
- - "~>"
|
|
31
31
|
- !ruby/object:Gem::Version
|
|
32
|
-
version: 1.
|
|
32
|
+
version: '1.11'
|
|
33
33
|
type: :development
|
|
34
34
|
prerelease: false
|
|
35
35
|
version_requirements: !ruby/object:Gem::Requirement
|
|
36
36
|
requirements:
|
|
37
37
|
- - "~>"
|
|
38
38
|
- !ruby/object:Gem::Version
|
|
39
|
-
version: 1.
|
|
39
|
+
version: '1.11'
|
|
40
40
|
- !ruby/object:Gem::Dependency
|
|
41
41
|
name: minitest
|
|
42
42
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -95,7 +95,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
95
95
|
- !ruby/object:Gem::Version
|
|
96
96
|
version: '0'
|
|
97
97
|
requirements: []
|
|
98
|
-
rubygems_version:
|
|
98
|
+
rubygems_version: 4.0.6
|
|
99
99
|
specification_version: 4
|
|
100
100
|
summary: Ruby bindings to Argon2
|
|
101
101
|
test_files: []
|