rubyntlm 0.5.3 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (57) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +3 -3
  3. data/.rspec +2 -2
  4. data/.travis.yml +10 -11
  5. data/CHANGELOG.md +5 -5
  6. data/Gemfile +3 -3
  7. data/LICENSE +19 -19
  8. data/Rakefile +22 -22
  9. data/lib/net/ntlm.rb +266 -263
  10. data/lib/net/ntlm/blob.rb +28 -28
  11. data/lib/net/ntlm/channel_binding.rb +65 -0
  12. data/lib/net/ntlm/client.rb +65 -65
  13. data/lib/net/ntlm/client/session.rb +237 -223
  14. data/lib/net/ntlm/encode_util.rb +49 -49
  15. data/lib/net/ntlm/exceptions.rb +14 -0
  16. data/lib/net/ntlm/field.rb +34 -34
  17. data/lib/net/ntlm/field_set.rb +129 -129
  18. data/lib/net/ntlm/int16_le.rb +25 -25
  19. data/lib/net/ntlm/int32_le.rb +24 -24
  20. data/lib/net/ntlm/int64_le.rb +25 -25
  21. data/lib/net/ntlm/message.rb +129 -129
  22. data/lib/net/ntlm/message/type0.rb +16 -16
  23. data/lib/net/ntlm/message/type1.rb +18 -18
  24. data/lib/net/ntlm/message/type2.rb +102 -102
  25. data/lib/net/ntlm/message/type3.rb +131 -131
  26. data/lib/net/ntlm/security_buffer.rb +47 -47
  27. data/lib/net/ntlm/string.rb +34 -34
  28. data/lib/net/ntlm/target_info.rb +89 -0
  29. data/lib/net/ntlm/version.rb +11 -11
  30. data/rubyntlm.gemspec +28 -28
  31. data/spec/lib/net/ntlm/blob_spec.rb +16 -16
  32. data/spec/lib/net/ntlm/channel_binding_spec.rb +17 -0
  33. data/spec/lib/net/ntlm/client/session_spec.rb +68 -68
  34. data/spec/lib/net/ntlm/client_spec.rb +64 -64
  35. data/spec/lib/net/ntlm/encode_util_spec.rb +16 -16
  36. data/spec/lib/net/ntlm/field_set_spec.rb +33 -33
  37. data/spec/lib/net/ntlm/field_spec.rb +34 -34
  38. data/spec/lib/net/ntlm/int16_le_spec.rb +17 -17
  39. data/spec/lib/net/ntlm/int32_le_spec.rb +18 -18
  40. data/spec/lib/net/ntlm/int64_le_spec.rb +18 -18
  41. data/spec/lib/net/ntlm/message/type0_spec.rb +20 -20
  42. data/spec/lib/net/ntlm/message/type1_spec.rb +131 -131
  43. data/spec/lib/net/ntlm/message/type2_spec.rb +132 -132
  44. data/spec/lib/net/ntlm/message/type3_spec.rb +225 -225
  45. data/spec/lib/net/ntlm/message_spec.rb +16 -16
  46. data/spec/lib/net/ntlm/security_buffer_spec.rb +64 -64
  47. data/spec/lib/net/ntlm/string_spec.rb +72 -72
  48. data/spec/lib/net/ntlm/target_info_spec.rb +76 -0
  49. data/spec/lib/net/ntlm/version_spec.rb +27 -27
  50. data/spec/lib/net/ntlm_spec.rb +127 -127
  51. data/spec/spec_helper.rb +22 -22
  52. data/spec/support/certificates/sha_256_hash.pem +19 -0
  53. data/spec/support/shared/examples/net/ntlm/field_shared.rb +25 -25
  54. data/spec/support/shared/examples/net/ntlm/fieldset_shared.rb +239 -239
  55. data/spec/support/shared/examples/net/ntlm/int_shared.rb +43 -43
  56. data/spec/support/shared/examples/net/ntlm/message_shared.rb +35 -35
  57. metadata +12 -3
@@ -1,34 +1,34 @@
1
- require 'spec_helper'
2
-
3
- describe Net::NTLM::Field do
4
-
5
- it_behaves_like 'a field', 'Foo', false
6
-
7
- context 'with no size specified' do
8
- let (:field_without_size) { Net::NTLM::Field.new({ :value => 'Foo', :active => true }) }
9
- it 'should set size to 0 if not active' do
10
- expect(field_without_size.size).to eq(0)
11
- end
12
-
13
- it 'should return 0 if active but no size specified' do
14
- field_without_size.active = true
15
- expect(field_without_size.size).to eq(0)
16
- end
17
- end
18
-
19
- context 'with a size specified' do
20
- let (:field_with_size) { Net::NTLM::Field.new({ :value => 'Foo', :active => true, :size => 100 }) }
21
-
22
- it 'should return the size provided in the initialize options if active' do
23
- expect(field_with_size.size).to eq(100)
24
- end
25
-
26
- it 'should still return 0 if not active' do
27
- field_with_size.active = false
28
- expect(field_with_size.size).to eq(0)
29
- end
30
- end
31
-
32
-
33
-
34
- end
1
+ require 'spec_helper'
2
+
3
+ describe Net::NTLM::Field do
4
+
5
+ it_behaves_like 'a field', 'Foo', false
6
+
7
+ context 'with no size specified' do
8
+ let (:field_without_size) { Net::NTLM::Field.new({ :value => 'Foo', :active => true }) }
9
+ it 'should set size to 0 if not active' do
10
+ expect(field_without_size.size).to eq(0)
11
+ end
12
+
13
+ it 'should return 0 if active but no size specified' do
14
+ field_without_size.active = true
15
+ expect(field_without_size.size).to eq(0)
16
+ end
17
+ end
18
+
19
+ context 'with a size specified' do
20
+ let (:field_with_size) { Net::NTLM::Field.new({ :value => 'Foo', :active => true, :size => 100 }) }
21
+
22
+ it 'should return the size provided in the initialize options if active' do
23
+ expect(field_with_size.size).to eq(100)
24
+ end
25
+
26
+ it 'should still return 0 if not active' do
27
+ field_with_size.active = false
28
+ expect(field_with_size.size).to eq(0)
29
+ end
30
+ end
31
+
32
+
33
+
34
+ end
@@ -1,18 +1,18 @@
1
- require 'spec_helper'
2
-
3
- describe Net::NTLM::Int16LE do
4
-
5
- int_values = {
6
- :default => 15,
7
- :default_hex => "\x0F\x00",
8
- :alt => 14,
9
- :alt_hex => "\x0E\x00",
10
- :small => "\x0F",
11
- :size => 2,
12
- :bits => 16
13
- }
14
-
15
- it_behaves_like 'a field', 15, false
16
- it_behaves_like 'an integer field', int_values
17
-
1
+ require 'spec_helper'
2
+
3
+ describe Net::NTLM::Int16LE do
4
+
5
+ int_values = {
6
+ :default => 15,
7
+ :default_hex => "\x0F\x00",
8
+ :alt => 14,
9
+ :alt_hex => "\x0E\x00",
10
+ :small => "\x0F",
11
+ :size => 2,
12
+ :bits => 16
13
+ }
14
+
15
+ it_behaves_like 'a field', 15, false
16
+ it_behaves_like 'an integer field', int_values
17
+
18
18
  end
@@ -1,19 +1,19 @@
1
- require 'spec_helper'
2
-
3
- describe Net::NTLM::Int32LE do
4
-
5
- int_values = {
6
- :default => 252716124,
7
- :default_hex => "\x5C\x24\x10\x0f",
8
- :alt => 235938908,
9
- :alt_hex => "\x5C\x24\x10\x0e",
10
- :small => "\x0F\x00",
11
- :size => 4,
12
- :bits => 32
13
- }
14
-
15
-
16
- it_behaves_like 'a field', 252716124, false
17
- it_behaves_like 'an integer field', int_values
18
-
1
+ require 'spec_helper'
2
+
3
+ describe Net::NTLM::Int32LE do
4
+
5
+ int_values = {
6
+ :default => 252716124,
7
+ :default_hex => "\x5C\x24\x10\x0f",
8
+ :alt => 235938908,
9
+ :alt_hex => "\x5C\x24\x10\x0e",
10
+ :small => "\x0F\x00",
11
+ :size => 4,
12
+ :bits => 32
13
+ }
14
+
15
+
16
+ it_behaves_like 'a field', 252716124, false
17
+ it_behaves_like 'an integer field', int_values
18
+
19
19
  end
@@ -1,19 +1,19 @@
1
- require 'spec_helper'
2
-
3
- describe Net::NTLM::Int64LE do
4
-
5
- int_values = {
6
- :default => 5294967295,
7
- :default_hex => [5294967295 & 0x00000000ffffffff, 5294967295 >> 32].pack("V2"),
8
- :alt => 5294967294,
9
- :alt_hex => [5294967294 & 0x00000000ffffffff, 5294967294 >> 32].pack("V2"),
10
- :small => "\x5C\x24\x10\x0f",
11
- :size => 8,
12
- :bits => 64
13
- }
14
-
15
-
16
- it_behaves_like 'a field', 252716124, false
17
- it_behaves_like 'an integer field', int_values
18
-
1
+ require 'spec_helper'
2
+
3
+ describe Net::NTLM::Int64LE do
4
+
5
+ int_values = {
6
+ :default => 5294967295,
7
+ :default_hex => [5294967295 & 0x00000000ffffffff, 5294967295 >> 32].pack("V2"),
8
+ :alt => 5294967294,
9
+ :alt_hex => [5294967294 & 0x00000000ffffffff, 5294967294 >> 32].pack("V2"),
10
+ :small => "\x5C\x24\x10\x0f",
11
+ :size => 8,
12
+ :bits => 64
13
+ }
14
+
15
+
16
+ it_behaves_like 'a field', 252716124, false
17
+ it_behaves_like 'an integer field', int_values
18
+
19
19
  end
@@ -1,21 +1,21 @@
1
- require 'spec_helper'
2
-
3
- describe Net::NTLM::Message::Type0 do
4
-
5
- fields = [
6
- { :name => :sign, :class => Net::NTLM::String, :value => Net::NTLM::SSP_SIGN, :active => true },
7
- { :name => :type, :class => Net::NTLM::Int32LE, :value => 0, :active => true },
8
- ]
9
- flags = [
10
- :UNICODE,
11
- :OEM,
12
- :REQUEST_TARGET,
13
- :NTLM,
14
- :ALWAYS_SIGN,
15
- :NTLM2_KEY
16
- ]
17
- it_behaves_like 'a fieldset', fields
18
- it_behaves_like 'a message', flags
19
-
20
-
1
+ require 'spec_helper'
2
+
3
+ describe Net::NTLM::Message::Type0 do
4
+
5
+ fields = [
6
+ { :name => :sign, :class => Net::NTLM::String, :value => Net::NTLM::SSP_SIGN, :active => true },
7
+ { :name => :type, :class => Net::NTLM::Int32LE, :value => 0, :active => true },
8
+ ]
9
+ flags = [
10
+ :UNICODE,
11
+ :OEM,
12
+ :REQUEST_TARGET,
13
+ :NTLM,
14
+ :ALWAYS_SIGN,
15
+ :NTLM2_KEY
16
+ ]
17
+ it_behaves_like 'a fieldset', fields
18
+ it_behaves_like 'a message', flags
19
+
20
+
21
21
  end
@@ -1,131 +1,131 @@
1
- require 'spec_helper'
2
-
3
- describe Net::NTLM::Message::Type1 do
4
- fields = [
5
- { :name => :sign, :class => Net::NTLM::String, :value => Net::NTLM::SSP_SIGN, :active => true },
6
- { :name => :type, :class => Net::NTLM::Int32LE, :value => 1, :active => true },
7
- { :name => :flag, :class => Net::NTLM::Int32LE, :value => Net::NTLM::DEFAULT_FLAGS[:TYPE1], :active => true },
8
- { :name => :domain, :class => Net::NTLM::SecurityBuffer, :value => '', :active => true },
9
- { :name => :workstation, :class => Net::NTLM::SecurityBuffer, :value => Socket.gethostname, :active => true },
10
- { :name => :os_version, :class => Net::NTLM::String, :value => '', :active => false },
11
- ]
12
- flags = [
13
- :UNICODE,
14
- :OEM,
15
- :REQUEST_TARGET,
16
- :NTLM,
17
- :ALWAYS_SIGN,
18
- :NTLM2_KEY
19
- ]
20
- it_behaves_like 'a fieldset', fields
21
- it_behaves_like 'a message', flags
22
-
23
- let(:type1_packet) {"TlRMTVNTUAABAAAAB4IIAAAAAAAgAAAAAAAAACAAAAA="}
24
-
25
- it 'should deserialize' do
26
- t1 = Net::NTLM::Message.decode64(type1_packet)
27
- expect(t1.class).to eq(Net::NTLM::Message::Type1)
28
- expect(t1.domain).to eq('')
29
- expect(t1.flag).to eq(557575)
30
- expect(t1.os_version).to eq('')
31
- expect(t1.sign).to eq("NTLMSSP\0")
32
- expect(t1.type).to eq(1)
33
- expect(t1.workstation).to eq('')
34
- end
35
-
36
- it 'should serialize' do
37
- t1 = Net::NTLM::Message::Type1.new
38
- t1.workstation = ''
39
- expect(t1.encode64).to eq(type1_packet)
40
- end
41
-
42
- describe '.parse' do
43
- subject(:message) { described_class.parse(data) }
44
- # http://davenport.sourceforge.net/ntlm.html#appendixC7
45
- context 'NTLM2 Session Response Authentication; NTLM2 Signing and Sealing Using the 128-bit NTLM2 Session Response User Session Key With Key Exchange Negotiated' do
46
- let(:data) do
47
- ['4e544c4d5353500001000000b78208e000000000000000000000000000000000'].pack('H*')
48
- end
49
-
50
- it 'should set the magic' do
51
- expect(message.sign).to eql(Net::NTLM::SSP_SIGN)
52
- end
53
- it 'should set the type' do
54
- expect(message.type).to eq(1)
55
- end
56
- it 'should set the flags' do
57
- expect(message.flag).to eq(0xe00882b7)
58
- expect(message).to have_flag(:UNICODE)
59
- expect(message).to have_flag(:OEM)
60
- expect(message).to have_flag(:REQUEST_TARGET)
61
- expect(message).to have_flag(:SIGN)
62
- expect(message).to have_flag(:SEAL)
63
- expect(message).to have_flag(:NTLM)
64
- expect(message).to have_flag(:ALWAYS_SIGN)
65
- expect(message).to have_flag(:NTLM2_KEY)
66
- expect(message).to have_flag(:KEY128)
67
- expect(message).to have_flag(:KEY_EXCHANGE)
68
- expect(message).to have_flag(:KEY56)
69
- end
70
- it 'should have empty workstation' do
71
- expect(message.workstation).to be_empty
72
- end
73
- it 'should have empty domain' do
74
- expect(message.domain).to be_empty
75
- end
76
-
77
- end
78
-
79
- # http://davenport.sourceforge.net/ntlm.html#appendixC9
80
- context 'NTLMv2 Authentication; NTLM1 Signing and Sealing Using the 40-bit NTLMv2 User Session Key' do
81
- let(:data) { ['4e544c4d53535000010000003782000000000000000000000000000000000000'].pack('H*') }
82
-
83
- it 'should set the magic' do
84
- expect(message.sign).to eql(Net::NTLM::SSP_SIGN)
85
- end
86
- it 'should set the type' do
87
- expect(message.type).to eq(1)
88
- end
89
- it 'should set the flags' do
90
- expect(message.flag).to eq(0x00008237)
91
- expect(message).to have_flag(:UNICODE)
92
- expect(message).to have_flag(:OEM)
93
- expect(message).to have_flag(:REQUEST_TARGET)
94
- expect(message).to have_flag(:SIGN)
95
- expect(message).to have_flag(:SEAL)
96
- expect(message).to have_flag(:NTLM)
97
- expect(message).to have_flag(:ALWAYS_SIGN)
98
- end
99
- it 'should have empty workstation' do
100
- expect(message.workstation).to be_empty
101
- end
102
- it 'should have empty domain' do
103
- expect(message.domain).to be_empty
104
- end
105
- end
106
-
107
- context 'NTLMv2 with OS version' do
108
- let(:data) { ['4e544c4d5353500001000000978208e2000000000000000000000000000000000602f0230000000f'].pack('H*') }
109
-
110
- it 'should set the magic' do
111
- expect(message.sign).to eql(Net::NTLM::SSP_SIGN)
112
- end
113
- it 'should set the type' do
114
- expect(message.type).to eq(1)
115
- end
116
- it 'should have empty workstation' do
117
- expect(message.workstation).to be_empty
118
- end
119
- it 'should have empty domain' do
120
- expect(message.domain).to be_empty
121
- end
122
-
123
- it 'should set OS version info' do
124
- expect(message.os_version).to eq(['0602f0230000000f'].pack('H*'))
125
- end
126
-
127
- end
128
-
129
- end
130
-
131
- end
1
+ require 'spec_helper'
2
+
3
+ describe Net::NTLM::Message::Type1 do
4
+ fields = [
5
+ { :name => :sign, :class => Net::NTLM::String, :value => Net::NTLM::SSP_SIGN, :active => true },
6
+ { :name => :type, :class => Net::NTLM::Int32LE, :value => 1, :active => true },
7
+ { :name => :flag, :class => Net::NTLM::Int32LE, :value => Net::NTLM::DEFAULT_FLAGS[:TYPE1], :active => true },
8
+ { :name => :domain, :class => Net::NTLM::SecurityBuffer, :value => '', :active => true },
9
+ { :name => :workstation, :class => Net::NTLM::SecurityBuffer, :value => Socket.gethostname, :active => true },
10
+ { :name => :os_version, :class => Net::NTLM::String, :value => '', :active => false },
11
+ ]
12
+ flags = [
13
+ :UNICODE,
14
+ :OEM,
15
+ :REQUEST_TARGET,
16
+ :NTLM,
17
+ :ALWAYS_SIGN,
18
+ :NTLM2_KEY
19
+ ]
20
+ it_behaves_like 'a fieldset', fields
21
+ it_behaves_like 'a message', flags
22
+
23
+ let(:type1_packet) {"TlRMTVNTUAABAAAAB4IIAAAAAAAgAAAAAAAAACAAAAA="}
24
+
25
+ it 'should deserialize' do
26
+ t1 = Net::NTLM::Message.decode64(type1_packet)
27
+ expect(t1.class).to eq(Net::NTLM::Message::Type1)
28
+ expect(t1.domain).to eq('')
29
+ expect(t1.flag).to eq(557575)
30
+ expect(t1.os_version).to eq('')
31
+ expect(t1.sign).to eq("NTLMSSP\0")
32
+ expect(t1.type).to eq(1)
33
+ expect(t1.workstation).to eq('')
34
+ end
35
+
36
+ it 'should serialize' do
37
+ t1 = Net::NTLM::Message::Type1.new
38
+ t1.workstation = ''
39
+ expect(t1.encode64).to eq(type1_packet)
40
+ end
41
+
42
+ describe '.parse' do
43
+ subject(:message) { described_class.parse(data) }
44
+ # http://davenport.sourceforge.net/ntlm.html#appendixC7
45
+ context 'NTLM2 Session Response Authentication; NTLM2 Signing and Sealing Using the 128-bit NTLM2 Session Response User Session Key With Key Exchange Negotiated' do
46
+ let(:data) do
47
+ ['4e544c4d5353500001000000b78208e000000000000000000000000000000000'].pack('H*')
48
+ end
49
+
50
+ it 'should set the magic' do
51
+ expect(message.sign).to eql(Net::NTLM::SSP_SIGN)
52
+ end
53
+ it 'should set the type' do
54
+ expect(message.type).to eq(1)
55
+ end
56
+ it 'should set the flags' do
57
+ expect(message.flag).to eq(0xe00882b7)
58
+ expect(message).to have_flag(:UNICODE)
59
+ expect(message).to have_flag(:OEM)
60
+ expect(message).to have_flag(:REQUEST_TARGET)
61
+ expect(message).to have_flag(:SIGN)
62
+ expect(message).to have_flag(:SEAL)
63
+ expect(message).to have_flag(:NTLM)
64
+ expect(message).to have_flag(:ALWAYS_SIGN)
65
+ expect(message).to have_flag(:NTLM2_KEY)
66
+ expect(message).to have_flag(:KEY128)
67
+ expect(message).to have_flag(:KEY_EXCHANGE)
68
+ expect(message).to have_flag(:KEY56)
69
+ end
70
+ it 'should have empty workstation' do
71
+ expect(message.workstation).to be_empty
72
+ end
73
+ it 'should have empty domain' do
74
+ expect(message.domain).to be_empty
75
+ end
76
+
77
+ end
78
+
79
+ # http://davenport.sourceforge.net/ntlm.html#appendixC9
80
+ context 'NTLMv2 Authentication; NTLM1 Signing and Sealing Using the 40-bit NTLMv2 User Session Key' do
81
+ let(:data) { ['4e544c4d53535000010000003782000000000000000000000000000000000000'].pack('H*') }
82
+
83
+ it 'should set the magic' do
84
+ expect(message.sign).to eql(Net::NTLM::SSP_SIGN)
85
+ end
86
+ it 'should set the type' do
87
+ expect(message.type).to eq(1)
88
+ end
89
+ it 'should set the flags' do
90
+ expect(message.flag).to eq(0x00008237)
91
+ expect(message).to have_flag(:UNICODE)
92
+ expect(message).to have_flag(:OEM)
93
+ expect(message).to have_flag(:REQUEST_TARGET)
94
+ expect(message).to have_flag(:SIGN)
95
+ expect(message).to have_flag(:SEAL)
96
+ expect(message).to have_flag(:NTLM)
97
+ expect(message).to have_flag(:ALWAYS_SIGN)
98
+ end
99
+ it 'should have empty workstation' do
100
+ expect(message.workstation).to be_empty
101
+ end
102
+ it 'should have empty domain' do
103
+ expect(message.domain).to be_empty
104
+ end
105
+ end
106
+
107
+ context 'NTLMv2 with OS version' do
108
+ let(:data) { ['4e544c4d5353500001000000978208e2000000000000000000000000000000000602f0230000000f'].pack('H*') }
109
+
110
+ it 'should set the magic' do
111
+ expect(message.sign).to eql(Net::NTLM::SSP_SIGN)
112
+ end
113
+ it 'should set the type' do
114
+ expect(message.type).to eq(1)
115
+ end
116
+ it 'should have empty workstation' do
117
+ expect(message.workstation).to be_empty
118
+ end
119
+ it 'should have empty domain' do
120
+ expect(message.domain).to be_empty
121
+ end
122
+
123
+ it 'should set OS version info' do
124
+ expect(message.os_version).to eq(['0602f0230000000f'].pack('H*'))
125
+ end
126
+
127
+ end
128
+
129
+ end
130
+
131
+ end