enzoic 1.0.3 → 1.1.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +12 -0
- data/Rakefile +4 -4
- data/ext/argon2-wrapper/.DS_Store +0 -0
- data/ext/phc-winner-argon2/argon2.dSYM/Contents/Info.plist +20 -0
- data/ext/phc-winner-argon2/libargon2.0.dylib +0 -0
- data/ext/phc-winner-argon2/libargon2.0.dylib.dSYM/Contents/Info.plist +20 -0
- data/ext/phc-winner-argon2/libargon2.0.dylib.dSYM/Contents/Resources/DWARF/libargon2.0.dylib +0 -0
- data/lib/enzoic.rb +29 -25
- data/lib/enzoic/version.rb +1 -1
- metadata +17 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 193cc6ee5e5585ea3a76add970ce69feb44c2383
|
4
|
+
data.tar.gz: a77cdcf48592e05a9f06ef1ad486467002f2df30
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 641ca919dd26147fe4e06550923f380f2b54eb0959372171f57a4f17ff2bcd5f98adcd446d3d39e9f0205910671307c7e78b6954ffa77e0ad58513f25ca31084
|
7
|
+
data.tar.gz: 9acf2c9d120dc0292f136b7583ba0d36f2aacd4c7e9fe52de19ec2c6468f7f42738e939250893345fe1fdc6e5d77b44e203db2558b34b0a541303365515b393d
|
data/README.md
CHANGED
@@ -48,6 +48,18 @@ else
|
|
48
48
|
puts("Credentials are not compromised")
|
49
49
|
end
|
50
50
|
|
51
|
+
# Check whether a specific set of credentials are compromised, using the optional
|
52
|
+
# lastCheckData parameter.
|
53
|
+
# lastCheckDate is the timestamp for the last check you performed for this user.
|
54
|
+
# If the DateTime you provide for the last check is greater than the timestamp Enzoic has
|
55
|
+
# for the last breach affecting this user, the check will not be performed.
|
56
|
+
# This can be used to substantially increase performance.
|
57
|
+
if enzoic.check_credentials("test@enzoic.com", "password-to-test", DateTime.parse("2019-07-15T19:57:43.000Z"))
|
58
|
+
puts("Credentials are compromised")
|
59
|
+
else
|
60
|
+
puts("Credentials are not compromised")
|
61
|
+
end
|
62
|
+
|
51
63
|
# get all exposures for a given user
|
52
64
|
exposures = enzoic.get_exposures_for_user("test@enzoic.com")
|
53
65
|
puts(exposures.count.to_s + " exposures found for test@enzoic.com")
|
data/Rakefile
CHANGED
@@ -20,9 +20,9 @@ Rake::ExtensionTask.new('whirlpool', gemspec) do |ext|
|
|
20
20
|
ext.lib_dir = 'lib/digest'
|
21
21
|
end
|
22
22
|
|
23
|
-
Rake::ExtensionTask.new('argon2-wrapper', gemspec) do |ext|
|
24
|
-
|
25
|
-
|
26
|
-
end
|
23
|
+
# Rake::ExtensionTask.new('argon2-wrapper', gemspec) do |ext|
|
24
|
+
# ext.ext_dir = 'ext/argon2-wrapper'
|
25
|
+
# ext.lib_dir = 'lib/enzoic'
|
26
|
+
# end
|
27
27
|
|
28
28
|
task :default => :test
|
Binary file
|
@@ -0,0 +1,20 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
3
|
+
<plist version="1.0">
|
4
|
+
<dict>
|
5
|
+
<key>CFBundleDevelopmentRegion</key>
|
6
|
+
<string>English</string>
|
7
|
+
<key>CFBundleIdentifier</key>
|
8
|
+
<string>com.apple.xcode.dsym.argon2</string>
|
9
|
+
<key>CFBundleInfoDictionaryVersion</key>
|
10
|
+
<string>6.0</string>
|
11
|
+
<key>CFBundlePackageType</key>
|
12
|
+
<string>dSYM</string>
|
13
|
+
<key>CFBundleSignature</key>
|
14
|
+
<string>????</string>
|
15
|
+
<key>CFBundleShortVersionString</key>
|
16
|
+
<string>1.0</string>
|
17
|
+
<key>CFBundleVersion</key>
|
18
|
+
<string>1</string>
|
19
|
+
</dict>
|
20
|
+
</plist>
|
Binary file
|
@@ -0,0 +1,20 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
3
|
+
<plist version="1.0">
|
4
|
+
<dict>
|
5
|
+
<key>CFBundleDevelopmentRegion</key>
|
6
|
+
<string>English</string>
|
7
|
+
<key>CFBundleIdentifier</key>
|
8
|
+
<string>com.apple.xcode.dsym.libargon2.0.dylib</string>
|
9
|
+
<key>CFBundleInfoDictionaryVersion</key>
|
10
|
+
<string>6.0</string>
|
11
|
+
<key>CFBundlePackageType</key>
|
12
|
+
<string>dSYM</string>
|
13
|
+
<key>CFBundleSignature</key>
|
14
|
+
<string>????</string>
|
15
|
+
<key>CFBundleShortVersionString</key>
|
16
|
+
<string>1.0</string>
|
17
|
+
<key>CFBundleVersion</key>
|
18
|
+
<string>1</string>
|
19
|
+
</dict>
|
20
|
+
</plist>
|
Binary file
|
data/lib/enzoic.rb
CHANGED
@@ -23,7 +23,7 @@ module Enzoic
|
|
23
23
|
@authString = calc_auth_string(@apiKey, @secret)
|
24
24
|
end
|
25
25
|
|
26
|
-
def check_credentials(username, password)
|
26
|
+
def check_credentials(username, password, lastCheckTimestamp = Date.new(1980, 1, 1))
|
27
27
|
raise EnzoicFail, "API key/Secret not set" if !@authString || @authString == ''
|
28
28
|
|
29
29
|
response = make_rest_call(@baseURL + Constants::ACCOUNTS_API_PATH + "?username=" + Hashing.sha256(username), "GET", nil)
|
@@ -33,40 +33,44 @@ module Enzoic
|
|
33
33
|
end
|
34
34
|
|
35
35
|
account_response = JSON.parse(response)
|
36
|
-
hashes_required = account_response["passwordHashesRequired"]
|
37
36
|
|
38
|
-
|
39
|
-
|
37
|
+
# if lastCheckTimestamp was provided, see if we need to go any further
|
38
|
+
if (Date.parse(account_response["lastBreachDate"]) > lastCheckTimestamp)
|
39
|
+
hashes_required = account_response["passwordHashesRequired"]
|
40
40
|
|
41
|
-
|
42
|
-
|
41
|
+
bcrypt_count = 0
|
42
|
+
query_string = ""
|
43
43
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
if
|
49
|
-
|
50
|
-
|
44
|
+
for i in 0..hashes_required.length - 1 do
|
45
|
+
hash_spec = hashes_required[i]
|
46
|
+
|
47
|
+
# bcrypt gets far too expensive for good response time if there are many of them to calculate.
|
48
|
+
# some mostly garbage accounts have accumulated a number of them in our DB and if we happen to hit one it
|
49
|
+
# kills performance, so short circuit out after at most 2 BCrypt hashes
|
50
|
+
if (hash_spec["hashType"] != PasswordType::BCrypt || bcrypt_count <= 2)
|
51
|
+
if (hash_spec["hashType"] == PasswordType::BCrypt)
|
52
|
+
bcrypt_count = bcrypt_count + 1
|
53
|
+
end
|
51
54
|
|
52
|
-
|
53
|
-
|
55
|
+
if (hash_spec["hashType"] != nil)
|
56
|
+
credential_hash = calc_credential_hash(username, password, account_response["salt"], hash_spec);
|
54
57
|
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
58
|
+
if (credential_hash != nil)
|
59
|
+
if (query_string.length == 0)
|
60
|
+
query_string = query_string + "?hashes=" + CGI.escape(credential_hash);
|
61
|
+
else
|
62
|
+
query_string = query_string + "&hashes=" + CGI.escape(credential_hash);
|
63
|
+
end
|
60
64
|
end
|
61
65
|
end
|
62
66
|
end
|
63
67
|
end
|
64
|
-
end
|
65
68
|
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
69
|
+
if (query_string.length > 0)
|
70
|
+
creds_response = make_rest_call(
|
71
|
+
@baseURL + Constants::CREDENTIALS_API_PATH + query_string, "GET", nil)
|
72
|
+
return creds_response != "404"
|
73
|
+
end
|
70
74
|
end
|
71
75
|
|
72
76
|
return false
|
data/lib/enzoic/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: enzoic
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Enzoic
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-08-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ffi
|
@@ -230,9 +230,11 @@ files:
|
|
230
230
|
- Rakefile
|
231
231
|
- enzoic.gemspec
|
232
232
|
- ext/.DS_Store
|
233
|
+
- ext/argon2-wrapper/.DS_Store
|
233
234
|
- ext/argon2-wrapper/Makefile
|
234
235
|
- ext/argon2-wrapper/argon2-wrapper.c
|
235
236
|
- ext/argon2-wrapper/extconf.rb
|
237
|
+
- ext/argon2-wrapper/libargon2-wrapper.bundle
|
236
238
|
- ext/argon2_import/.DS_Store
|
237
239
|
- ext/digest/whirlpool/extconf.rb
|
238
240
|
- ext/digest/whirlpool/whirlpool-algorithm.c
|
@@ -251,7 +253,10 @@ files:
|
|
251
253
|
- ext/phc-winner-argon2/Makefile
|
252
254
|
- ext/phc-winner-argon2/README.md
|
253
255
|
- ext/phc-winner-argon2/appveyor.yml
|
256
|
+
- ext/phc-winner-argon2/argon2
|
254
257
|
- ext/phc-winner-argon2/argon2-specs.pdf
|
258
|
+
- ext/phc-winner-argon2/argon2.dSYM/Contents/Info.plist
|
259
|
+
- ext/phc-winner-argon2/argon2.dSYM/Contents/Resources/DWARF/argon2
|
255
260
|
- ext/phc-winner-argon2/export.sh
|
256
261
|
- ext/phc-winner-argon2/include/argon2.h
|
257
262
|
- ext/phc-winner-argon2/kats/argon2d
|
@@ -278,27 +283,37 @@ files:
|
|
278
283
|
- ext/phc-winner-argon2/latex/pics/generic.pdf
|
279
284
|
- ext/phc-winner-argon2/latex/pics/power-distribution.jpg
|
280
285
|
- ext/phc-winner-argon2/latex/tradeoff.bib
|
286
|
+
- ext/phc-winner-argon2/libargon2.0.dylib
|
287
|
+
- ext/phc-winner-argon2/libargon2.0.dylib.dSYM/Contents/Info.plist
|
288
|
+
- ext/phc-winner-argon2/libargon2.0.dylib.dSYM/Contents/Resources/DWARF/libargon2.0.dylib
|
289
|
+
- ext/phc-winner-argon2/libargon2.a
|
281
290
|
- ext/phc-winner-argon2/libargon2.pc
|
282
291
|
- ext/phc-winner-argon2/man/argon2.1
|
283
292
|
- ext/phc-winner-argon2/src/argon2.c
|
293
|
+
- ext/phc-winner-argon2/src/argon2.o
|
284
294
|
- ext/phc-winner-argon2/src/bench.c
|
285
295
|
- ext/phc-winner-argon2/src/blake2/blake2-impl.h
|
286
296
|
- ext/phc-winner-argon2/src/blake2/blake2.h
|
287
297
|
- ext/phc-winner-argon2/src/blake2/blake2b.c
|
298
|
+
- ext/phc-winner-argon2/src/blake2/blake2b.o
|
288
299
|
- ext/phc-winner-argon2/src/blake2/blamka-round-opt.h
|
289
300
|
- ext/phc-winner-argon2/src/blake2/blamka-round-ref.h
|
290
301
|
- ext/phc-winner-argon2/src/core.c
|
291
302
|
- ext/phc-winner-argon2/src/core.h
|
303
|
+
- ext/phc-winner-argon2/src/core.o
|
292
304
|
- ext/phc-winner-argon2/src/encoding.c
|
293
305
|
- ext/phc-winner-argon2/src/encoding.h
|
306
|
+
- ext/phc-winner-argon2/src/encoding.o
|
294
307
|
- ext/phc-winner-argon2/src/genkat.c
|
295
308
|
- ext/phc-winner-argon2/src/genkat.h
|
296
309
|
- ext/phc-winner-argon2/src/opt.c
|
310
|
+
- ext/phc-winner-argon2/src/opt.o
|
297
311
|
- ext/phc-winner-argon2/src/ref.c
|
298
312
|
- ext/phc-winner-argon2/src/run.c
|
299
313
|
- ext/phc-winner-argon2/src/test.c
|
300
314
|
- ext/phc-winner-argon2/src/thread.c
|
301
315
|
- ext/phc-winner-argon2/src/thread.h
|
316
|
+
- ext/phc-winner-argon2/src/thread.o
|
302
317
|
- ext/phc-winner-argon2/vs2015/Argon2Opt/Argon2Opt.vcxproj
|
303
318
|
- ext/phc-winner-argon2/vs2015/Argon2Opt/Argon2Opt.vcxproj.filters
|
304
319
|
- ext/phc-winner-argon2/vs2015/Argon2OptBench/Argon2OptBench.vcxproj
|