/
digest_utils_test.rb
141 lines (127 loc) · 6.81 KB
/
digest_utils_test.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
# encoding: utf-8
$LOAD_PATH.unshift File.dirname(__FILE__) + '/../lib'
require 'test/unit'
require 'httpauth/digest'
require 'base64'
class DigestUtilsTest < Test::Unit::TestCase
def setup
@data = {
:credentials => {
'Digest username="marcél", realm="testrealm@host.com", nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093", uri="/dir/index.html", qop=auth, nc=00000001, cnonce="0a4f113b", response="6629fae49393a05397450978507c4ef1", opaque="5ccc069c403ebaf9f0171e9517f40e41"' => {:username => 'marcél', :realm => 'testrealm@host.com', :nonce => 'dcd98b7102dd2f0e8b11d0f600bfb0c093', :uri => '/dir/index.html', :qop => 'auth', :nc => 1, :cnonce => '0a4f113b', :response => '6629fae49393a05397450978507c4ef1', :opaque => '5ccc069c403ebaf9f0171e9517f40e41'}
},
:challenge => {
'Digest realm="mp@mount.dwerg.net", nonce="QG4LS2UcBAA=b978f6e632f6b9f7a8927ab48e20ef61d967552b", algorithm=MD5, qop="auth"' => {:realm => 'mp@mount.dwerg.net', :nonce => 'QG4LS2UcBAA=b978f6e632f6b9f7a8927ab48e20ef61d967552b', :algorithm => 'MD5', :qop => ['auth']}
},
:auth => {
'nextnonce="4b21d1ddd4f814c3e7c26226ffa4ddf33a261982ff915c1154a8"' => {:nextnonce => '4b21d1ddd4f814c3e7c26226ffa4ddf33a261982ff915c1154a8'},
'nextnonce="5339bdd7a1d4032a4e4cac3733ee59d63da44efe9e1412f15881", qop=auth, cnonce="0a4f113b", nc=00000001' => {
:nextnonce => '5339bdd7a1d4032a4e4cac3733ee59d63da44efe9e1412f15881', :qop => 'auth', :cnonce => '0a4f113b', :nc => 1},
'nextnonce="19c325e2ebf0e938c3c67225aba5f23ad245a522415d6cbb3c16", qop=auth, cnonce="0a4f113b", nc=00000001, rspauth="5ccc069c403ebaf9f0171e9517f40e41"' => {
:nextnonce => '19c325e2ebf0e938c3c67225aba5f23ad245a522415d6cbb3c16', :qop => 'auth', :cnonce => '0a4f113b', :nc => 1,
:rspauth => '5ccc069c403ebaf9f0171e9517f40e41'}
}
}
end
def test_filter_h_on
assert_equal({1 => 1, 2 => 2}, HTTPAuth::Digest::Utils.filter_h_on({1 => 1, 2 => 2, 3 => 3}, [1, 2]))
assert_equal({1 => 1}, HTTPAuth::Digest::Utils.filter_h_on({1 => 1, 2 => 2}, [1]))
assert_equal({2 => 2}, HTTPAuth::Digest::Utils.filter_h_on({1 => 1, 2 => 2}, [2]))
assert_equal({}, HTTPAuth::Digest::Utils.filter_h_on({1 => 1, 2 => 2}, []))
assert_equal({}, HTTPAuth::Digest::Utils.filter_h_on({}, []))
end
def test_encode_directives
@data.each do |k, v|
v.each do |encoded, directives|
assert_equal encoded.length, HTTPAuth::Digest::Utils.encode_directives(directives, k).length, "In #{k}, in #{encoded}"
end
end
end
def test_decode_directives
@data.each do |k, v|
v.each do |encoded, directives|
assert_equal directives, HTTPAuth::Digest::Utils.decode_directives(encoded, k), "In #{k}, in #{encoded}"
end
end
end
def test_decode_hacks
# Test to see if the IE and Safari directive encode problems are HACKed around
directives = HTTPAuth::Digest::Utils.decode_directives("Digest qop=\"auth\", algorithm=\"MD5\"", :credentials)
assert_equal 'auth', directives[:qop]
assert_equal 'MD5', directives[:algorithm]
end
def test_encode_decode_mirror
@data.each do |k, v|
v.each do |_, directives|
assert_equal directives,
HTTPAuth::Digest::Utils.decode_directives(
HTTPAuth::Digest::Utils.encode_directives(directives, k),
k), "In #{k}, in #{directives.inspect}"
end
end
end
def test_digest_concat
assert_equal '', HTTPAuth::Digest::Utils.digest_concat
assert_equal 'a', HTTPAuth::Digest::Utils.digest_concat('a')
assert_equal 'a:b:c', HTTPAuth::Digest::Utils.digest_concat('a', 'b', 'c')
end
def test_digest_h
assert_raise(TypeError) do
HTTPAuth::Digest::Utils.digest_h(nil)
end
assert_equal 32, HTTPAuth::Digest::Utils.digest_h('a').length
end
def test_digest_kd
assert_equal 32, HTTPAuth::Digest::Utils.digest_kd(nil, nil).length
assert_equal 32, HTTPAuth::Digest::Utils.digest_kd(nil, 'b').length
assert_equal 32, HTTPAuth::Digest::Utils.digest_kd('a', nil).length
assert_equal 32, HTTPAuth::Digest::Utils.digest_kd('a', 'b').length
end
def test_digest_a1
[
['742ec081c96652ff7aed5d819ea0061b', {:username => 'marcél',
:realm => 'testrealm@host.com',
:password => 'secret'
}, {}],
['0630c5b7ea77f10dcca9bbcabb574cf9', {:username => 'marcél',
:realm => 'testrealm@host.com',
:password => 'secret',
:nonce => 'dcd98b7102dd2f0e8b11d0f600bfb0c093',
:cnonce => '0a4f113b',
:algorithm => 'MD5-sess'
}, {}],
['18c37cbf78f82ee4fcce3d457d02091a', {:username => 'Mustafa',
:realm => 'testrealm@host.com',
:password => 'Circle Of Life',
:nonce => 'dcd98b7102dd2f0e8b11d0f600bfb0c093',
:cnonce => '0a4f113b',
:algorithm => 'MD5-sess'
}, {}],
['4501c091b0366d76ea3218b6cfdd8097', {}, {:digest => '742ec081c96652ff7aed5d819ea0061b'}],
['52cac169f0b9ffbc38f91a50fdc86097', {:nonce => 'dcd98b7102dd2f0e8b11d0f600bfb0c093',
:cnonce => '0a4f113b',
:algorithm => 'MD5-sess'
}, {:digest => '742ec081c96652ff7aed5d819ea0061b'}]
].each_with_index do |expected, i|
assert_equal expected[0], HTTPAuth::Digest::Utils.digest_a1(expected[1], expected[2]), "In #{i}:"
end
end
def test_request_digest_a2
[
['bfdaff59f040a7a7e2a96fc32841dcf7', {:method => 'GET', :uri => '/posts/1'}],
['7c79b99028e43d5bdb6110a6b579344e', {:method => 'POST', :uri => '/posts/4'}],
['1db0cc6a00afef1763eb73abf5a0b151', {:method => 'TRACE', :uri => '/posts', :request_body => "I'm a request body!"}],
['e73cf9345dfdd81c1c649d5c2eb46566', {:method => 'TRACE', :uri => '/posts', :request_body => "I'm a request body!", :qop => 'auth-int'}]
].each_with_index do |expected, i|
assert_equal expected[0], HTTPAuth::Digest::Utils.request_digest_a2(expected[1]), "In #{i}:"
end
end
def test_create_nonce
salt = 'My secret salt'
assert HTTPAuth::Digest::Utils.create_nonce(salt).length > 32
assert_not_equal HTTPAuth::Digest::Utils.create_nonce(salt), HTTPAuth::Digest::Utils.create_nonce(salt)
end
def test_create_opaque
assert_equal 32, HTTPAuth::Digest::Utils.create_opaque.length
assert_not_equal HTTPAuth::Digest::Utils.create_opaque, HTTPAuth::Digest::Utils.create_opaque
end
end