]> git.openstreetmap.org Git - rails.git/blob - test/lib/password_hash_test.rb
Merge pull request #7302 from tomhughes/terms-locale
[rails.git] / test / lib / password_hash_test.rb
1 # frozen_string_literal: true
2
3 require "test_helper"
4
5 class PasswordHashTest < ActiveSupport::TestCase
6   def test_md5_without_salt
7     assert_not PasswordHash.check("5f4dcc3b5aa765d61d8327deb882cf99", nil, "password")
8     assert_not PasswordHash.check("5f4dcc3b5aa765d61d8327deb882cf99", nil, "wrong")
9     assert PasswordHash.upgrade?("5f4dcc3b5aa765d61d8327deb882cf99", nil)
10     assert_not PasswordHash.valid?("5f4dcc3b5aa765d61d8327deb882cf99", nil)
11   end
12
13   def test_md5_with_salt
14     assert_not PasswordHash.check("67a1e09bb1f83f5007dc119c14d663aa", "salt", "password")
15     assert_not PasswordHash.check("67a1e09bb1f83f5007dc119c14d663aa", "salt", "wrong")
16     assert_not PasswordHash.check("67a1e09bb1f83f5007dc119c14d663aa", "wrong", "password")
17     assert PasswordHash.upgrade?("67a1e09bb1f83f5007dc119c14d663aa", "salt")
18     assert_not PasswordHash.valid?("67a1e09bb1f83f5007dc119c14d663aa", "salt")
19   end
20
21   def test_pbkdf2_1000_32_sha512
22     assert PasswordHash.check("ApT/28+FsTBLa/J8paWfgU84SoRiTfeY8HjKWhgHy08=", "sha512!1000!HR4z+hAvKV2ra1gpbRybtoNzm/CNKe4cf7bPKwdUNrk=", "password")
23     assert_not PasswordHash.check("ApT/28+FsTBLa/J8paWfgU84SoRiTfeY8HjKWhgHy08=", "sha512!1000!HR4z+hAvKV2ra1gpbRybtoNzm/CNKe4cf7bPKwdUNrk=", "wrong")
24     assert_not PasswordHash.check("ApT/28+FsTBLa/J8paWfgU84SoRiTfeY8HjKWhgHy08=", "sha512!1000!HR4z+hAvKV2ra1gwrongtoNzm/CNKe4cf7bPKwdUNrk=", "password")
25     assert PasswordHash.upgrade?("ApT/28+FsTBLa/J8paWfgU84SoRiTfeY8HjKWhgHy08=", "sha512!1000!HR4z+hAvKV2ra1gpbRybtoNzm/CNKe4cf7bPKwdUNrk=")
26     assert PasswordHash.valid?("ApT/28+FsTBLa/J8paWfgU84SoRiTfeY8HjKWhgHy08=", "sha512!1000!HR4z+hAvKV2ra1gpbRybtoNzm/CNKe4cf7bPKwdUNrk=")
27   end
28
29   def test_pbkdf2_10000_32_sha512
30     assert PasswordHash.check("3wYbPiOxk/tU0eeIDjUhdvi8aDP3AbFtwYKKxF1IhGg=", "sha512!10000!OUQLgtM7eD8huvanFT5/WtWaCwdOdrir8QOtFwxhO0A=", "password")
31     assert_not PasswordHash.check("3wYbPiOxk/tU0eeIDjUhdvi8aDP3AbFtwYKKxF1IhGg=", "sha512!10000!OUQLgtM7eD8huvanFT5/WtWaCwdOdrir8QOtFwxhO0A=", "wrong")
32     assert_not PasswordHash.check("3wYbPiOxk/tU0eeIDjUhdvi8aDP3AbFtwYKKxF1IhGg=", "sha512!10000!OUQLgtMwronguvanFT5/WtWaCwdOdrir8QOtFwxhO0A=", "password")
33     assert PasswordHash.upgrade?("3wYbPiOxk/tU0eeIDjUhdvi8aDP3AbFtwYKKxF1IhGg=", "sha512!10000!OUQLgtM7eD8huvanFT5/WtWaCwdOdrir8QOtFwxhO0A=")
34     assert PasswordHash.valid?("3wYbPiOxk/tU0eeIDjUhdvi8aDP3AbFtwYKKxF1IhGg=", "sha512!10000!OUQLgtM7eD8huvanFT5/WtWaCwdOdrir8QOtFwxhO0A=")
35   end
36
37   def test_argon2_t2_m16_p1
38     assert PasswordHash.check("$argon2id$v=19$m=65536,t=2,p=1$b2E7zSvjT6TC5DXrqvfxwg$P4hly807ckgYc+kfvaf3rqmJcmKStzw+kV14oMaz8PQ", nil, "password")
39     assert_not PasswordHash.check("$argon2id$v=19$m=65536,t=2,p=1$b2E7zSvjT6TC5DXrqvfxwg$P4hly807ckgYc+kfvaf3rqmJcmKStzw+kV14oMaz8PQ", nil, "wrong")
40     assert_not PasswordHash.check("$argon2id$v=19$m=65536,t=2,p=1$b2E7zSvwrong5DXrqvfxwg$P4hly807ckgYc+kfvaf3rqmJcmKStzw+kV14oMaz8PQ", nil, "password")
41     assert PasswordHash.upgrade?("$argon2id$v=19$m=65536,t=2,p=1$b2E7zSvjT6TC5DXrqvfxwg$P4hly807ckgYc+kfvaf3rqmJcmKStzw+kV14oMaz8PQ", nil)
42     assert PasswordHash.valid?("$argon2id$v=19$m=65536,t=2,p=1$b2E7zSvjT6TC5DXrqvfxwg$P4hly807ckgYc+kfvaf3rqmJcmKStzw+kV14oMaz8PQ", nil)
43   end
44
45   def test_argon2_t3_m16_p4
46     assert PasswordHash.check("$argon2id$v=19$m=65536,t=3,p=4$uxzL4aYTEDTRr2+KNA1qNQ$yuNOtH+IsCwWUbE4OGu+hIC0e4iyZ2wGhaCsQY1mJpI", nil, "password")
47     assert_not PasswordHash.check("$argon2id$v=19$m=65536,t=3,p=4$uxzL4aYTEDTRr2+KNA1qNQ$yuNOtH+IsCwWUbE4OGu+hIC0e4iyZ2wGhaCsQY1mJpI", nil, "wrong")
48     assert_not PasswordHash.check("$argon2id$v=19$m=65536,t=3,p=4$uxzL4aYwrongr2+KNA1qNQ$yuNOtH+IsCwWUbE4OGu+hIC0e4iyZ2wGhaCsQY1mJpI", nil, "password")
49     assert_not PasswordHash.upgrade?("$argon2id$v=19$m=65536,t=3,p=4$uxzL4aYTEDTRr2+KNA1qNQ$yuNOtH+IsCwWUbE4OGu+hIC0e4iyZ2wGhaCsQY1mJpI", nil)
50     assert PasswordHash.valid?("$argon2id$v=19$m=65536,t=3,p=4$uxzL4aYTEDTRr2+KNA1qNQ$yuNOtH+IsCwWUbE4OGu+hIC0e4iyZ2wGhaCsQY1mJpI", nil)
51   end
52
53   def test_default
54     hash1, salt1 = PasswordHash.create("password")
55     hash2, salt2 = PasswordHash.create("password")
56     assert_not_equal hash1, hash2
57     assert_nil salt1
58     assert_nil salt2
59     assert PasswordHash.check(hash1, salt1, "password")
60     assert_not PasswordHash.check(hash1, salt1, "wrong")
61     assert PasswordHash.check(hash2, salt2, "password")
62     assert_not PasswordHash.check(hash2, salt2, "wrong")
63     assert_not PasswordHash.upgrade?(hash1, salt1)
64     assert_not PasswordHash.upgrade?(hash2, salt2)
65     assert PasswordHash.valid?(hash1, salt1)
66     assert PasswordHash.valid?(hash2, salt2)
67   end
68
69   def test_format
70     hash, _salt = PasswordHash.create("password")
71     format = Argon2::HashFormat.new(hash)
72
73     assert_equal "argon2id", format.variant
74     assert_operator format.version, :<=, 19
75   end
76 end