passwordping 1.0.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 (95) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +16 -0
  3. data/.gitmodules +3 -0
  4. data/Gemfile +4 -0
  5. data/LICENSE +5 -0
  6. data/README.md +89 -0
  7. data/Rakefile +11 -0
  8. data/ext/argon2-wrapper/Makefile +74 -0
  9. data/ext/argon2-wrapper/extconf.rb +1 -0
  10. data/ext/phc-winner-argon2/.gitattributes +10 -0
  11. data/ext/phc-winner-argon2/.gitignore +21 -0
  12. data/ext/phc-winner-argon2/.travis.yml +14 -0
  13. data/ext/phc-winner-argon2/Argon2.sln +160 -0
  14. data/ext/phc-winner-argon2/CHANGELOG.md +25 -0
  15. data/ext/phc-winner-argon2/LICENSE +314 -0
  16. data/ext/phc-winner-argon2/Makefile +187 -0
  17. data/ext/phc-winner-argon2/README.md +290 -0
  18. data/ext/phc-winner-argon2/appveyor.yml +25 -0
  19. data/ext/phc-winner-argon2/argon2-specs.pdf +0 -0
  20. data/ext/phc-winner-argon2/export.sh +7 -0
  21. data/ext/phc-winner-argon2/include/argon2.h +435 -0
  22. data/ext/phc-winner-argon2/kats/argon2d +12304 -0
  23. data/ext/phc-winner-argon2/kats/argon2d.shasum +1 -0
  24. data/ext/phc-winner-argon2/kats/argon2d_v16 +12304 -0
  25. data/ext/phc-winner-argon2/kats/argon2d_v16.shasum +1 -0
  26. data/ext/phc-winner-argon2/kats/argon2i +12304 -0
  27. data/ext/phc-winner-argon2/kats/argon2i.shasum +1 -0
  28. data/ext/phc-winner-argon2/kats/argon2i_v16 +12304 -0
  29. data/ext/phc-winner-argon2/kats/argon2i_v16.shasum +1 -0
  30. data/ext/phc-winner-argon2/kats/argon2id +12304 -0
  31. data/ext/phc-winner-argon2/kats/argon2id.shasum +1 -0
  32. data/ext/phc-winner-argon2/kats/argon2id_v16 +12304 -0
  33. data/ext/phc-winner-argon2/kats/argon2id_v16.shasum +1 -0
  34. data/ext/phc-winner-argon2/kats/check-sums.ps1 +42 -0
  35. data/ext/phc-winner-argon2/kats/check-sums.sh +13 -0
  36. data/ext/phc-winner-argon2/kats/test.ps1 +50 -0
  37. data/ext/phc-winner-argon2/kats/test.sh +49 -0
  38. data/ext/phc-winner-argon2/latex/IEEEtran.cls +6347 -0
  39. data/ext/phc-winner-argon2/latex/Makefile +18 -0
  40. data/ext/phc-winner-argon2/latex/argon2-specs.tex +920 -0
  41. data/ext/phc-winner-argon2/latex/pics/argon2-par.pdf +0 -0
  42. data/ext/phc-winner-argon2/latex/pics/compression.pdf +0 -0
  43. data/ext/phc-winner-argon2/latex/pics/generic.pdf +0 -0
  44. data/ext/phc-winner-argon2/latex/pics/power-distribution.jpg +0 -0
  45. data/ext/phc-winner-argon2/latex/tradeoff.bib +822 -0
  46. data/ext/phc-winner-argon2/libargon2.pc +16 -0
  47. data/ext/phc-winner-argon2/man/argon2.1 +57 -0
  48. data/ext/phc-winner-argon2/src/argon2.c +452 -0
  49. data/ext/phc-winner-argon2/src/bench.c +111 -0
  50. data/ext/phc-winner-argon2/src/blake2/blake2-impl.h +156 -0
  51. data/ext/phc-winner-argon2/src/blake2/blake2.h +91 -0
  52. data/ext/phc-winner-argon2/src/blake2/blake2b.c +390 -0
  53. data/ext/phc-winner-argon2/src/blake2/blamka-round-opt.h +328 -0
  54. data/ext/phc-winner-argon2/src/blake2/blamka-round-ref.h +56 -0
  55. data/ext/phc-winner-argon2/src/core.c +635 -0
  56. data/ext/phc-winner-argon2/src/core.h +227 -0
  57. data/ext/phc-winner-argon2/src/encoding.c +463 -0
  58. data/ext/phc-winner-argon2/src/encoding.h +57 -0
  59. data/ext/phc-winner-argon2/src/genkat.c +208 -0
  60. data/ext/phc-winner-argon2/src/genkat.h +49 -0
  61. data/ext/phc-winner-argon2/src/opt.c +241 -0
  62. data/ext/phc-winner-argon2/src/ref.c +194 -0
  63. data/ext/phc-winner-argon2/src/run.c +317 -0
  64. data/ext/phc-winner-argon2/src/test.c +254 -0
  65. data/ext/phc-winner-argon2/src/thread.c +57 -0
  66. data/ext/phc-winner-argon2/src/thread.h +67 -0
  67. data/ext/phc-winner-argon2/vs2015/Argon2Opt/Argon2Opt.vcxproj +226 -0
  68. data/ext/phc-winner-argon2/vs2015/Argon2Opt/Argon2Opt.vcxproj.filters +69 -0
  69. data/ext/phc-winner-argon2/vs2015/Argon2OptBench/Argon2OptBench.vcxproj +226 -0
  70. data/ext/phc-winner-argon2/vs2015/Argon2OptBench/Argon2OptBench.vcxproj.filters +69 -0
  71. data/ext/phc-winner-argon2/vs2015/Argon2OptDll/Argon2OptDll.vcxproj +225 -0
  72. data/ext/phc-winner-argon2/vs2015/Argon2OptDll/Argon2OptDll.vcxproj.filters +66 -0
  73. data/ext/phc-winner-argon2/vs2015/Argon2OptGenKAT/Argon2OptGenKAT.vcxproj +239 -0
  74. data/ext/phc-winner-argon2/vs2015/Argon2OptGenKAT/Argon2OptGenKAT.vcxproj.filters +72 -0
  75. data/ext/phc-winner-argon2/vs2015/Argon2OptTestCI/Argon2OptTestCI.vcxproj +227 -0
  76. data/ext/phc-winner-argon2/vs2015/Argon2OptTestCI/Argon2OptTestCI.vcxproj.filters +69 -0
  77. data/ext/phc-winner-argon2/vs2015/Argon2Ref/Argon2Ref.vcxproj +226 -0
  78. data/ext/phc-winner-argon2/vs2015/Argon2Ref/Argon2Ref.vcxproj.filters +69 -0
  79. data/ext/phc-winner-argon2/vs2015/Argon2RefBench/Argon2RefBench.vcxproj +226 -0
  80. data/ext/phc-winner-argon2/vs2015/Argon2RefBench/Argon2RefBench.vcxproj.filters +69 -0
  81. data/ext/phc-winner-argon2/vs2015/Argon2RefDll/Argon2RefDll.vcxproj +225 -0
  82. data/ext/phc-winner-argon2/vs2015/Argon2RefDll/Argon2RefDll.vcxproj.filters +66 -0
  83. data/ext/phc-winner-argon2/vs2015/Argon2RefGenKAT/Argon2RefGenKAT.vcxproj +227 -0
  84. data/ext/phc-winner-argon2/vs2015/Argon2RefGenKAT/Argon2RefGenKAT.vcxproj.filters +72 -0
  85. data/ext/phc-winner-argon2/vs2015/Argon2RefTestCI/Argon2RefTestCI.vcxproj +226 -0
  86. data/ext/phc-winner-argon2/vs2015/Argon2RefTestCI/Argon2RefTestCI.vcxproj.filters +69 -0
  87. data/lib/passwordping.rb +186 -0
  88. data/lib/passwordping/argon2_wrapper_ffi.rb +89 -0
  89. data/lib/passwordping/constants.rb +10 -0
  90. data/lib/passwordping/errors.rb +3 -0
  91. data/lib/passwordping/hashing.rb +160 -0
  92. data/lib/passwordping/password_type.rb +24 -0
  93. data/lib/passwordping/version.rb +5 -0
  94. data/passwordping.gemspec +34 -0
  95. metadata +304 -0
@@ -0,0 +1,89 @@
1
+ require 'ffi'
2
+ require 'ffi-compiler/loader'
3
+
4
+ module PasswordPing
5
+
6
+ # Import of argon2 wrapper library
7
+ module Ext
8
+ extend FFI::Library
9
+ ffi_lib FFI::Compiler::Loader.find('argon2-wrapper')
10
+
11
+ # int argon2i_hash_raw(const uint32_t t_cost, const uint32_t m_cost,
12
+ # const uint32_t parallelism, const void *pwd,
13
+ # const size_t pwdlen, const void *salt,
14
+ # const size_t saltlen, void *hash, const size_t hashlen);
15
+
16
+ attach_function :argon2i_hash_raw, [
17
+ :uint, :uint, :uint, :pointer,
18
+ :size_t, :pointer, :size_t, :pointer, :size_t], :int, :blocking => true
19
+
20
+ attach_function :argon2i_hash_encoded, [
21
+ :uint, :uint, :uint, :pointer,
22
+ :size_t, :pointer, :size_t, :size_t, :pointer, :size_t], :int, :blocking => true
23
+
24
+ # int argon2d_hash_raw(const uint32_t t_cost, const uint32_t m_cost,
25
+ # const uint32_t parallelism, const void *pwd,
26
+ # const size_t pwdlen, const void *salt,
27
+ # const size_t saltlen, void *hash, const size_t hashlen);
28
+
29
+ attach_function :argon2d_hash_raw, [
30
+ :uint, :uint, :uint, :pointer,
31
+ :size_t, :pointer, :size_t, :pointer, :size_t], :int, :blocking => true
32
+
33
+ attach_function :argon2d_hash_encoded, [
34
+ :uint, :uint, :uint, :pointer,
35
+ :size_t, :pointer, :size_t, :size_t, :pointer, :size_t], :int, :blocking => true
36
+ end
37
+
38
+ # The engine class shields users from the FFI interface.
39
+ # It is generally not advised to directly use this class.
40
+ class Argon2Wrapper
41
+ def self.hash_argon2i(password, salt, t_cost, m_cost, lanes, hash_length)
42
+ result = ''
43
+ FFI::MemoryPointer.new(:char, hash_length) do |buffer|
44
+ ret = Ext.argon2i_hash_raw(t_cost, 1 << m_cost, lanes, password,
45
+ password.length, salt, salt.length,
46
+ buffer, hash_length)
47
+ raise ArgonHashFail, ERRORS[ret.abs] unless ret.zero?
48
+ result = buffer.read_string(hash_length)
49
+ end
50
+ result.unpack('H*').join
51
+ end
52
+
53
+ def self.hash_argon2i_encode(password, salt, t_cost, m_cost, lanes, hash_length)
54
+ result = ''
55
+ FFI::MemoryPointer.new(:char, 96 + salt.length) do |buffer|
56
+ ret = Ext.argon2i_hash_encoded(t_cost, 1 << m_cost, lanes, password,
57
+ password.length, salt, salt.length,
58
+ hash_length, buffer, 96 + salt.length)
59
+ raise ArgonHashFail, ERRORS[ret.abs] unless ret.zero?
60
+ result = buffer.read_string(96 + salt.length)
61
+ end
62
+ result.delete "\0"
63
+ end
64
+
65
+ def self.hash_argon2d(password, salt, t_cost, m_cost, lanes, hash_length)
66
+ result = ''
67
+ FFI::MemoryPointer.new(:char, hash_length) do |buffer|
68
+ ret = Ext.argon2d_hash_raw(t_cost, 1 << m_cost, lanes, password,
69
+ password.length, salt, salt.length,
70
+ buffer, hash_length)
71
+ raise ArgonHashFail, ERRORS[ret.abs] unless ret.zero?
72
+ result = buffer.read_string(hash_length)
73
+ end
74
+ result.unpack('H*').join
75
+ end
76
+
77
+ def self.hash_argon2d_encode(password, salt, t_cost, m_cost, lanes, hash_length)
78
+ result = ''
79
+ FFI::MemoryPointer.new(:char, 96 + salt.length) do |buffer|
80
+ ret = Ext.argon2d_hash_encoded(t_cost, 1 << m_cost, lanes, password,
81
+ password.length, salt, salt.length,
82
+ hash_length, buffer, 96 + salt.length)
83
+ raise ArgonHashFail, ERRORS[ret.abs] unless ret.zero?
84
+ result = buffer.read_string(96 + salt.length)
85
+ end
86
+ result.delete "\0"
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,10 @@
1
+ module PasswordPing
2
+ # Constants utilized by the PasswordPing module
3
+ module Constants
4
+ CREDENTIALS_API_PATH = "/credentials"
5
+ PASSWORDS_API_PATH = "/passwords"
6
+ EXPOSURES_API_PATH = "/exposures"
7
+ ACCOUNTS_API_PATH = "/accounts"
8
+ ALERTS_SERVICE_PATH = "/alert-subscriptions"
9
+ end
10
+ end
@@ -0,0 +1,3 @@
1
+ module PasswordPing
2
+ class PasswordPingFail < StandardError; end
3
+ end
@@ -0,0 +1,160 @@
1
+ require 'passwordping/argon2_wrapper_ffi'
2
+ require 'digest'
3
+ require 'cryptopp'
4
+ require 'bcrypt'
5
+ require 'unix_crypt'
6
+
7
+ module PasswordPing
8
+ class Hashing
9
+ def self.md5(to_hash)
10
+ return Digest::MD5.hexdigest to_hash
11
+ end
12
+
13
+ def self.md5_binary(to_hash)
14
+ return Digest::MD5.digest(to_hash).bytes
15
+ end
16
+
17
+ def self.md5_binary_array(to_hash_bytes)
18
+ return Digest::MD5.digest(to_hash_bytes.pack('c*')).bytes
19
+ end
20
+
21
+ def self.sha1(to_hash)
22
+ return Digest::SHA1.hexdigest to_hash
23
+ end
24
+
25
+ def self.sha256(to_hash)
26
+ return Digest::SHA256.hexdigest to_hash
27
+ end
28
+
29
+ def self.sha512(to_hash)
30
+ return Digest::SHA512.hexdigest to_hash
31
+ end
32
+
33
+ def self.sha512_binary(to_hash)
34
+ return Digest::SHA512.digest to_hash
35
+ end
36
+
37
+ def self.sha512_binary_array(to_hash)
38
+ return Digest::SHA512.digest(to_hash).bytes
39
+ end
40
+
41
+ def self.whirlpool(to_hash)
42
+ return CryptoPP.digest_factory(:whirlpool, to_hash).digest_hex
43
+ end
44
+
45
+ def self.whirlpool_binary(to_hash)
46
+ return CryptoPP.digest_factory(:whirlpool, to_hash).digest
47
+ end
48
+
49
+ def self.whirlpool_binary_array(to_hash)
50
+ return CryptoPP.digest_factory(:whirlpool, to_hash).digest.bytes
51
+ end
52
+
53
+ def self.crc32(to_hash)
54
+ hash = CryptoPP.digest_factory(:crc32, to_hash).digest_hex
55
+ # correct for endian-ness
56
+ return hash[6] + hash[7] + hash[4] + hash[5] + hash[2] + hash[3] + hash[0] + hash[1]
57
+ end
58
+
59
+ def self.mybb(to_hash, salt)
60
+ return self.md5(self.md5(salt) + self.md5(to_hash))
61
+ end
62
+
63
+ def self.vbulletin(to_hash, salt)
64
+ return self.md5(self.md5(to_hash) + salt)
65
+ end
66
+
67
+ def self.bcrypt(to_hash, salt)
68
+ return BCrypt::Engine.hash_secret(to_hash, salt)
69
+ end
70
+
71
+ def self.phpbb3(to_hash, salt)
72
+ if !salt.start_with?("$H$")
73
+ return ""
74
+ end
75
+
76
+ itoa64 = "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
77
+ to_hash_bytes = to_hash.bytes
78
+ count = 2**itoa64.index(salt[3])
79
+ justsalt = salt[4..12]
80
+
81
+ hash = self.md5_binary(justsalt + to_hash)
82
+ loop do
83
+ hash = self.md5_binary_array(hash.push(to_hash_bytes).flatten!)
84
+ count = count - 1;
85
+ break if count == 0
86
+ end
87
+
88
+ hashout = ""
89
+ i = 0
90
+ count = 16
91
+ value = 0
92
+
93
+ loop do
94
+ value = hash[i] + (hash[i] < 0 ? 256 : 0)
95
+ i = i + 1
96
+ hashout = hashout + itoa64[value & 63]
97
+ if i < count
98
+ value = value | (hash[i] + (hash[i] < 0 ? 256 : 0)) << 8;
99
+ end
100
+
101
+ hashout = hashout + itoa64[(value >> 6) & 63]
102
+ i = i + 1
103
+ if (i >= count)
104
+ break
105
+ end
106
+
107
+ if (i < count)
108
+ value = value | (hash[i] + (hash[i] < 0 ? 256 : 0)) << 16
109
+ end
110
+
111
+ hashout = hashout + itoa64[(value >> 12) & 63]
112
+
113
+ i = i + 1
114
+ if (i >= count)
115
+ break
116
+ end
117
+
118
+ hashout = hashout + itoa64[(value >> 18) & 63]
119
+
120
+ break if i == count
121
+ end
122
+
123
+ return salt + hashout
124
+ end
125
+
126
+ def self.custom_algorithm1(to_hash, salt)
127
+ return self.bytes_to_hex(self.xor(self.sha512_binary_array(to_hash + salt), self.whirlpool_binary_array(salt + to_hash)))
128
+ end
129
+
130
+ def self.custom_algorithm2(to_hash, salt)
131
+ return self.md5(to_hash + salt)
132
+ end
133
+
134
+ def self.md5crypt(to_hash, salt)
135
+ return UnixCrypt::MD5.build(to_hash, salt.start_with?("$1$") ? salt[3..salt.length] : salt);
136
+ end
137
+
138
+ def self.argon2(to_hash, salt)
139
+ return Argon2Wrapper.hash_argon2d_encode(to_hash, salt, 3, 10, 2, 20)
140
+ end
141
+
142
+ def self.xor(byte_array1, byte_array2)
143
+ result = Array.new(byte_array1.length);
144
+
145
+ for i in 0..byte_array1.length - 1 do
146
+ result[i] = byte_array1[i] ^ byte_array2[i];
147
+ end
148
+
149
+ return result;
150
+ end
151
+
152
+ def self.bytes_to_hex(bytes)
153
+ return bytes.pack('c*').unpack('H*')[0]
154
+ end
155
+
156
+ def self.hex_to_bytes(hex)
157
+ hex.scan(/../).map { |x| x.hex }.pack('c*')
158
+ end
159
+ end
160
+ end
@@ -0,0 +1,24 @@
1
+ module PasswordPing
2
+ # Constants utilized by the PasswordPing module
3
+ module PasswordType
4
+ Plaintext = 0
5
+ MD5 = 1
6
+ SHA1 = 2
7
+ SHA256 = 3
8
+ TripleDES = 4
9
+ IPBoard_MyBB = 5
10
+ VBulletinPre3_8_5 = 6
11
+ VBulletinPost3_8_5 = 7
12
+ BCrypt = 8
13
+ CRC32 = 9
14
+ PHPBB3 = 10
15
+ CustomAlgorithm1 = 11
16
+ SCrypt = 12
17
+ CustomAlgorithm2 = 13
18
+ SHA512 = 14
19
+ MD5Crypt = 16
20
+ Unknown = 97
21
+ UnusablePassword = 98
22
+ None = 99
23
+ end
24
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+ # Standard Gem version constant.
3
+ module PasswordPing
4
+ VERSION = "1.0.0".freeze
5
+ end
@@ -0,0 +1,34 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'passwordping/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "passwordping"
8
+ spec.version = PasswordPing::VERSION
9
+ spec.authors = ["PasswordPing"]
10
+ spec.email = ["support@passwordping.com"]
11
+
12
+ spec.summary = 'Ruby library for PasswordPing API'
13
+ spec.description = 'Ruby library for PasswordPing API'
14
+ spec.homepage = 'https://github.com/passwordping/passwordping-ruby-client'
15
+ spec.license = 'MIT'
16
+
17
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
18
+ spec.files << `find ext`.split
19
+
20
+ spec.bindir = "exe"
21
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
22
+ spec.require_paths = ["lib"]
23
+ spec.add_dependency 'ffi', '~> 1.9'
24
+ spec.add_dependency 'ffi-compiler', '~> 0.1'
25
+ spec.add_dependency 'rest-client', '~> 2.0', '>= 2.0.2'
26
+ spec.add_dependency 'cryptopp', '~> 0.0', '>= 0.0.5'
27
+ spec.add_dependency 'bcrypt', '~> 3.1', '>= 3.1.11'
28
+ spec.add_dependency 'unix-crypt', '~> 1.3'
29
+
30
+ spec.add_development_dependency "bundler", '~> 1.10', '>= 1.10.5'
31
+ spec.add_development_dependency "rake", '~> 10.4', '>= 10.4.2'
32
+ spec.add_development_dependency "test-unit", '~> 3.2', '>= 3.2.4'
33
+ spec.extensions << 'ext/argon2-wrapper/extconf.rb'
34
+ end
metadata ADDED
@@ -0,0 +1,304 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: passwordping
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - PasswordPing
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2017-06-02 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: ffi
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.9'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.9'
27
+ - !ruby/object:Gem::Dependency
28
+ name: ffi-compiler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0.1'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0.1'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rest-client
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '2.0'
48
+ - - ">="
49
+ - !ruby/object:Gem::Version
50
+ version: 2.0.2
51
+ type: :runtime
52
+ prerelease: false
53
+ version_requirements: !ruby/object:Gem::Requirement
54
+ requirements:
55
+ - - "~>"
56
+ - !ruby/object:Gem::Version
57
+ version: '2.0'
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: 2.0.2
61
+ - !ruby/object:Gem::Dependency
62
+ name: cryptopp
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '0.0'
68
+ - - ">="
69
+ - !ruby/object:Gem::Version
70
+ version: 0.0.5
71
+ type: :runtime
72
+ prerelease: false
73
+ version_requirements: !ruby/object:Gem::Requirement
74
+ requirements:
75
+ - - "~>"
76
+ - !ruby/object:Gem::Version
77
+ version: '0.0'
78
+ - - ">="
79
+ - !ruby/object:Gem::Version
80
+ version: 0.0.5
81
+ - !ruby/object:Gem::Dependency
82
+ name: bcrypt
83
+ requirement: !ruby/object:Gem::Requirement
84
+ requirements:
85
+ - - "~>"
86
+ - !ruby/object:Gem::Version
87
+ version: '3.1'
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ version: 3.1.11
91
+ type: :runtime
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - "~>"
96
+ - !ruby/object:Gem::Version
97
+ version: '3.1'
98
+ - - ">="
99
+ - !ruby/object:Gem::Version
100
+ version: 3.1.11
101
+ - !ruby/object:Gem::Dependency
102
+ name: unix-crypt
103
+ requirement: !ruby/object:Gem::Requirement
104
+ requirements:
105
+ - - "~>"
106
+ - !ruby/object:Gem::Version
107
+ version: '1.3'
108
+ type: :runtime
109
+ prerelease: false
110
+ version_requirements: !ruby/object:Gem::Requirement
111
+ requirements:
112
+ - - "~>"
113
+ - !ruby/object:Gem::Version
114
+ version: '1.3'
115
+ - !ruby/object:Gem::Dependency
116
+ name: bundler
117
+ requirement: !ruby/object:Gem::Requirement
118
+ requirements:
119
+ - - "~>"
120
+ - !ruby/object:Gem::Version
121
+ version: '1.10'
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: 1.10.5
125
+ type: :development
126
+ prerelease: false
127
+ version_requirements: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '1.10'
132
+ - - ">="
133
+ - !ruby/object:Gem::Version
134
+ version: 1.10.5
135
+ - !ruby/object:Gem::Dependency
136
+ name: rake
137
+ requirement: !ruby/object:Gem::Requirement
138
+ requirements:
139
+ - - "~>"
140
+ - !ruby/object:Gem::Version
141
+ version: '10.4'
142
+ - - ">="
143
+ - !ruby/object:Gem::Version
144
+ version: 10.4.2
145
+ type: :development
146
+ prerelease: false
147
+ version_requirements: !ruby/object:Gem::Requirement
148
+ requirements:
149
+ - - "~>"
150
+ - !ruby/object:Gem::Version
151
+ version: '10.4'
152
+ - - ">="
153
+ - !ruby/object:Gem::Version
154
+ version: 10.4.2
155
+ - !ruby/object:Gem::Dependency
156
+ name: test-unit
157
+ requirement: !ruby/object:Gem::Requirement
158
+ requirements:
159
+ - - "~>"
160
+ - !ruby/object:Gem::Version
161
+ version: '3.2'
162
+ - - ">="
163
+ - !ruby/object:Gem::Version
164
+ version: 3.2.4
165
+ type: :development
166
+ prerelease: false
167
+ version_requirements: !ruby/object:Gem::Requirement
168
+ requirements:
169
+ - - "~>"
170
+ - !ruby/object:Gem::Version
171
+ version: '3.2'
172
+ - - ">="
173
+ - !ruby/object:Gem::Version
174
+ version: 3.2.4
175
+ description: Ruby library for PasswordPing API
176
+ email:
177
+ - support@passwordping.com
178
+ executables: []
179
+ extensions:
180
+ - ext/argon2-wrapper/extconf.rb
181
+ extra_rdoc_files: []
182
+ files:
183
+ - ".gitignore"
184
+ - ".gitmodules"
185
+ - Gemfile
186
+ - LICENSE
187
+ - README.md
188
+ - Rakefile
189
+ - ext/argon2-wrapper/Makefile
190
+ - ext/argon2-wrapper/extconf.rb
191
+ - ext/argon2-wrapper/libargon2-wrapper.bundle
192
+ - ext/argon2-wrapper/libargon2-wrapper.bundle.dSYM/Contents/Info.plist
193
+ - ext/argon2-wrapper/libargon2-wrapper.bundle.dSYM/Contents/Resources/DWARF/libargon2-wrapper.bundle
194
+ - ext/phc-winner-argon2/.git
195
+ - ext/phc-winner-argon2/.gitattributes
196
+ - ext/phc-winner-argon2/.gitignore
197
+ - ext/phc-winner-argon2/.travis.yml
198
+ - ext/phc-winner-argon2/Argon2.sln
199
+ - ext/phc-winner-argon2/CHANGELOG.md
200
+ - ext/phc-winner-argon2/LICENSE
201
+ - ext/phc-winner-argon2/Makefile
202
+ - ext/phc-winner-argon2/README.md
203
+ - ext/phc-winner-argon2/appveyor.yml
204
+ - ext/phc-winner-argon2/argon2-specs.pdf
205
+ - ext/phc-winner-argon2/export.sh
206
+ - ext/phc-winner-argon2/include/argon2.h
207
+ - ext/phc-winner-argon2/kats/argon2d
208
+ - ext/phc-winner-argon2/kats/argon2d.shasum
209
+ - ext/phc-winner-argon2/kats/argon2d_v16
210
+ - ext/phc-winner-argon2/kats/argon2d_v16.shasum
211
+ - ext/phc-winner-argon2/kats/argon2i
212
+ - ext/phc-winner-argon2/kats/argon2i.shasum
213
+ - ext/phc-winner-argon2/kats/argon2i_v16
214
+ - ext/phc-winner-argon2/kats/argon2i_v16.shasum
215
+ - ext/phc-winner-argon2/kats/argon2id
216
+ - ext/phc-winner-argon2/kats/argon2id.shasum
217
+ - ext/phc-winner-argon2/kats/argon2id_v16
218
+ - ext/phc-winner-argon2/kats/argon2id_v16.shasum
219
+ - ext/phc-winner-argon2/kats/check-sums.ps1
220
+ - ext/phc-winner-argon2/kats/check-sums.sh
221
+ - ext/phc-winner-argon2/kats/test.ps1
222
+ - ext/phc-winner-argon2/kats/test.sh
223
+ - ext/phc-winner-argon2/latex/IEEEtran.cls
224
+ - ext/phc-winner-argon2/latex/Makefile
225
+ - ext/phc-winner-argon2/latex/argon2-specs.tex
226
+ - ext/phc-winner-argon2/latex/pics/argon2-par.pdf
227
+ - ext/phc-winner-argon2/latex/pics/compression.pdf
228
+ - ext/phc-winner-argon2/latex/pics/generic.pdf
229
+ - ext/phc-winner-argon2/latex/pics/power-distribution.jpg
230
+ - ext/phc-winner-argon2/latex/tradeoff.bib
231
+ - ext/phc-winner-argon2/libargon2.pc
232
+ - ext/phc-winner-argon2/man/argon2.1
233
+ - ext/phc-winner-argon2/src/argon2.c
234
+ - ext/phc-winner-argon2/src/bench.c
235
+ - ext/phc-winner-argon2/src/blake2/blake2-impl.h
236
+ - ext/phc-winner-argon2/src/blake2/blake2.h
237
+ - ext/phc-winner-argon2/src/blake2/blake2b.c
238
+ - ext/phc-winner-argon2/src/blake2/blamka-round-opt.h
239
+ - ext/phc-winner-argon2/src/blake2/blamka-round-ref.h
240
+ - ext/phc-winner-argon2/src/core.c
241
+ - ext/phc-winner-argon2/src/core.h
242
+ - ext/phc-winner-argon2/src/encoding.c
243
+ - ext/phc-winner-argon2/src/encoding.h
244
+ - ext/phc-winner-argon2/src/genkat.c
245
+ - ext/phc-winner-argon2/src/genkat.h
246
+ - ext/phc-winner-argon2/src/opt.c
247
+ - ext/phc-winner-argon2/src/ref.c
248
+ - ext/phc-winner-argon2/src/run.c
249
+ - ext/phc-winner-argon2/src/test.c
250
+ - ext/phc-winner-argon2/src/thread.c
251
+ - ext/phc-winner-argon2/src/thread.h
252
+ - ext/phc-winner-argon2/vs2015/Argon2Opt/Argon2Opt.vcxproj
253
+ - ext/phc-winner-argon2/vs2015/Argon2Opt/Argon2Opt.vcxproj.filters
254
+ - ext/phc-winner-argon2/vs2015/Argon2OptBench/Argon2OptBench.vcxproj
255
+ - ext/phc-winner-argon2/vs2015/Argon2OptBench/Argon2OptBench.vcxproj.filters
256
+ - ext/phc-winner-argon2/vs2015/Argon2OptDll/Argon2OptDll.vcxproj
257
+ - ext/phc-winner-argon2/vs2015/Argon2OptDll/Argon2OptDll.vcxproj.filters
258
+ - ext/phc-winner-argon2/vs2015/Argon2OptGenKAT/Argon2OptGenKAT.vcxproj
259
+ - ext/phc-winner-argon2/vs2015/Argon2OptGenKAT/Argon2OptGenKAT.vcxproj.filters
260
+ - ext/phc-winner-argon2/vs2015/Argon2OptTestCI/Argon2OptTestCI.vcxproj
261
+ - ext/phc-winner-argon2/vs2015/Argon2OptTestCI/Argon2OptTestCI.vcxproj.filters
262
+ - ext/phc-winner-argon2/vs2015/Argon2Ref/Argon2Ref.vcxproj
263
+ - ext/phc-winner-argon2/vs2015/Argon2Ref/Argon2Ref.vcxproj.filters
264
+ - ext/phc-winner-argon2/vs2015/Argon2RefBench/Argon2RefBench.vcxproj
265
+ - ext/phc-winner-argon2/vs2015/Argon2RefBench/Argon2RefBench.vcxproj.filters
266
+ - ext/phc-winner-argon2/vs2015/Argon2RefDll/Argon2RefDll.vcxproj
267
+ - ext/phc-winner-argon2/vs2015/Argon2RefDll/Argon2RefDll.vcxproj.filters
268
+ - ext/phc-winner-argon2/vs2015/Argon2RefGenKAT/Argon2RefGenKAT.vcxproj
269
+ - ext/phc-winner-argon2/vs2015/Argon2RefGenKAT/Argon2RefGenKAT.vcxproj.filters
270
+ - ext/phc-winner-argon2/vs2015/Argon2RefTestCI/Argon2RefTestCI.vcxproj
271
+ - ext/phc-winner-argon2/vs2015/Argon2RefTestCI/Argon2RefTestCI.vcxproj.filters
272
+ - lib/passwordping.rb
273
+ - lib/passwordping/argon2_wrapper_ffi.rb
274
+ - lib/passwordping/constants.rb
275
+ - lib/passwordping/errors.rb
276
+ - lib/passwordping/hashing.rb
277
+ - lib/passwordping/password_type.rb
278
+ - lib/passwordping/version.rb
279
+ - passwordping.gemspec
280
+ homepage: https://github.com/passwordping/passwordping-ruby-client
281
+ licenses:
282
+ - MIT
283
+ metadata: {}
284
+ post_install_message:
285
+ rdoc_options: []
286
+ require_paths:
287
+ - lib
288
+ required_ruby_version: !ruby/object:Gem::Requirement
289
+ requirements:
290
+ - - ">="
291
+ - !ruby/object:Gem::Version
292
+ version: '0'
293
+ required_rubygems_version: !ruby/object:Gem::Requirement
294
+ requirements:
295
+ - - ">="
296
+ - !ruby/object:Gem::Version
297
+ version: '0'
298
+ requirements: []
299
+ rubyforge_project:
300
+ rubygems_version: 2.6.11
301
+ signing_key:
302
+ specification_version: 4
303
+ summary: Ruby library for PasswordPing API
304
+ test_files: []