rubyntlm 0.6.1 → 0.6.2

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 (57) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +4 -3
  3. data/.rspec +2 -2
  4. data/.travis.yml +13 -12
  5. data/CHANGELOG.md +118 -6
  6. data/Gemfile +3 -3
  7. data/LICENSE +19 -19
  8. data/Rakefile +25 -22
  9. data/lib/net/ntlm.rb +266 -266
  10. data/lib/net/ntlm/blob.rb +28 -28
  11. data/lib/net/ntlm/channel_binding.rb +65 -65
  12. data/lib/net/ntlm/client.rb +65 -65
  13. data/lib/net/ntlm/client/session.rb +237 -237
  14. data/lib/net/ntlm/encode_util.rb +48 -48
  15. data/lib/net/ntlm/exceptions.rb +14 -14
  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 -89
  29. data/lib/net/ntlm/version.rb +11 -11
  30. data/rubyntlm.gemspec +29 -28
  31. data/spec/lib/net/ntlm/blob_spec.rb +16 -16
  32. data/spec/lib/net/ntlm/channel_binding_spec.rb +17 -17
  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 -76
  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 -19
  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 +17 -3
@@ -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
@@ -1,132 +1,132 @@
1
- # encoding: UTF-8
2
- require 'spec_helper'
3
-
4
- describe Net::NTLM::Message::Type2 do
5
-
6
- fields = [
7
- { :name => :sign, :class => Net::NTLM::String, :value => Net::NTLM::SSP_SIGN, :active => true },
8
- { :name => :type, :class => Net::NTLM::Int32LE, :value => 2, :active => true },
9
- { :name => :challenge, :class => Net::NTLM::Int64LE, :value => 0, :active => true },
10
- { :name => :context, :class => Net::NTLM::Int64LE, :value => 0, :active => false },
11
- { :name => :flag, :class => Net::NTLM::Int32LE, :value => Net::NTLM::DEFAULT_FLAGS[:TYPE2], :active => true },
12
- { :name => :target_name, :class => Net::NTLM::SecurityBuffer, :value => '', :active => true },
13
- { :name => :target_info, :class => Net::NTLM::SecurityBuffer, :value => '', :active => false },
14
- { :name => :os_version, :class => Net::NTLM::String, :value => '', :active => false },
15
- ]
16
- flags = [
17
- :UNICODE
18
- ]
19
- it_behaves_like 'a fieldset', fields
20
- it_behaves_like 'a message', flags
21
-
22
- let(:type2_packet) {"TlRMTVNTUAACAAAAHAAcADgAAAAFgooCJ+UA1//+ZM4AAAAAAAAAAJAAkABUAAAABgGxHQAAAA9WAEEARwBSAEEATgBUAC0AMgAwADAAOABSADIAAgAcAFYAQQBHAFIAQQBOAFQALQAyADAAMAA4AFIAMgABABwAVgBBAEcAUgBBAE4AVAAtADIAMAAwADgAUgAyAAQAHAB2AGEAZwByAGEAbgB0AC0AMgAwADAAOABSADIAAwAcAHYAYQBnAHIAYQBuAHQALQAyADAAMAA4AFIAMgAHAAgAZBMdFHQnzgEAAAAA"}
23
- let(:type3_packet) {"TlRMTVNTUAADAAAAGAAYAEQAAADAAMAAXAAAAAAAAAAcAQAADgAOABwBAAAUABQAKgEAAAAAAAA+AQAABYKKAgAAAADVS27TfQGmWxSSbXmolTUQyxJmD8ISQuBKKHFKC8GksUZISYc8Ps9RAQEAAAAAAAAANasTdCfOAcsSZg/CEkLgAAAAAAIAHABWAEEARwBSAEEATgBUAC0AMgAwADAAOABSADIAAQAcAFYAQQBHAFIAQQBOAFQALQAyADAAMAA4AFIAMgAEABwAdgBhAGcAcgBhAG4AdAAtADIAMAAwADgAUgAyAAMAHAB2AGEAZwByAGEAbgB0AC0AMgAwADAAOABSADIABwAIAGQTHRR0J84BAAAAAAAAAAB2AGEAZwByAGEAbgB0AGsAbwBiAGUALgBsAG8AYwBhAGwA"}
24
-
25
- it 'should deserialize' do
26
- t2 = Net::NTLM::Message.decode64(type2_packet)
27
- expect(t2.class).to eq(Net::NTLM::Message::Type2)
28
- expect(t2.challenge).to eq(14872292244261496103)
29
- expect(t2.context).to eq(0)
30
- expect(t2.flag).to eq(42631685)
31
- expect(t2.os_version).to eq(['0601b11d0000000f'].pack('H*'))
32
- expect(t2.sign).to eq("NTLMSSP\0")
33
-
34
- t2_target_info = Net::NTLM::EncodeUtil.decode_utf16le(t2.target_info)
35
- if RUBY_VERSION == "1.8.7"
36
- expect(t2_target_info).to eq("\x02\x1CVAGRANT-2008R2\x01\x1CVAGRANT-2008R2\x04\x1Cvagrant-2008R2\x03\x1Cvagrant-2008R2\a\b\e$(D+&\e(B\0\0")
37
- else
38
- expect(t2_target_info).to eq("\u0002\u001CVAGRANT-2008R2\u0001\u001CVAGRANT-2008R2\u0004\u001Cvagrant-2008R2\u0003\u001Cvagrant-2008R2\a\b፤ᐝ❴ǎ\0\0")
39
- end
40
-
41
- expect(Net::NTLM::EncodeUtil.decode_utf16le(t2.target_name)).to eq("VAGRANT-2008R2")
42
- expect(t2.type).to eq(2)
43
- end
44
-
45
- it 'should serialize' do
46
- source = Net::NTLM::Message.decode64(type2_packet)
47
-
48
- t2 = Net::NTLM::Message::Type2.new
49
- t2.challenge = source.challenge
50
- t2.context = source.context
51
- t2.flag = source.flag
52
- t2.os_version = source.os_version
53
- t2.sign = source.sign
54
- t2.target_info = source.target_info
55
- t2.target_name = source.target_name
56
- t2.type = source.type
57
- t2.enable(:context)
58
- t2.enable(:target_info)
59
- t2.enable(:os_version)
60
-
61
- expect(t2.encode64).to eq(type2_packet)
62
- end
63
-
64
- it 'should generate a type 3 response' do
65
- t2 = Net::NTLM::Message.decode64(type2_packet)
66
-
67
- type3_known = Net::NTLM::Message.decode64(type3_packet)
68
- type3_known.flag = 0x028a8205
69
- type3_known.enable(:session_key)
70
- type3_known.enable(:flag)
71
-
72
- t3 = t2.response({:user => 'vagrant', :password => 'vagrant', :domain => ''}, {:ntlmv2 => true, :workstation => 'kobe.local'})
73
- expect(t3.domain).to eq(type3_known.domain)
74
- expect(t3.flag).to eq(type3_known.flag)
75
- expect(t3.sign).to eq("NTLMSSP\0")
76
- expect(t3.workstation).to eq("k\0o\0b\0e\0.\0l\0o\0c\0a\0l\0")
77
- expect(t3.user).to eq("v\0a\0g\0r\0a\0n\0t\0")
78
- expect(t3.session_key).to eq('')
79
- end
80
-
81
- it 'should upcase domain when provided' do
82
- t2 = Net::NTLM::Message.decode64(type2_packet)
83
- t3 = t2.response({:user => 'vagrant', :password => 'vagrant', :domain => 'domain'}, {:ntlmv2 => true, :workstation => 'kobe.local'})
84
- expect(t3.domain).to eq("D\0O\0M\0A\0I\0N\0")
85
- end
86
-
87
- describe '.parse' do
88
- subject(:message) { described_class.parse(data) }
89
- # http://davenport.sourceforge.net/ntlm.html#appendixC7
90
- context 'NTLM2 Session Response Authentication; NTLM2 Signing and Sealing Using the 128-bit NTLM2 Session Response User Session Key With Key Exchange Negotiated' do
91
- let(:data) do
92
- [
93
- '4e544c4d53535000020000000c000c0030000000358289e0677f1c557a5ee96c' \
94
- '0000000000000000460046003c00000054004500530054004e00540002000c00' \
95
- '54004500530054004e00540001000c004d0045004d0042004500520003001e00' \
96
- '6d0065006d006200650072002e0074006500730074002e0063006f006d000000' \
97
- '0000'
98
- ].pack('H*')
99
- end
100
-
101
- it 'should set the magic' do
102
- expect(message.sign).to eql(Net::NTLM::SSP_SIGN)
103
- end
104
- it 'should set the type' do
105
- expect(message.type).to eq(2)
106
- end
107
- it 'should set the target name' do
108
- # TESTNT
109
- expect(message.target_name).to eq(["54004500530054004e005400"].pack('H*'))
110
- end
111
- it 'should set the flags' do
112
- expect(message.flag).to eq(0xe0898235)
113
- end
114
- it 'should set the challenge' do
115
- expect(message.challenge).to eq(0x6ce95e7a551c7f67)
116
- end
117
- it 'should set an empty context' do
118
- expect(message.context).to be_zero
119
- end
120
- it 'should set target info' do
121
- ti = [
122
- '02000c0054004500530054004e00540001000c004d0045004d00420045005200' \
123
- '03001e006d0065006d006200650072002e0074006500730074002e0063006f00' \
124
- '6d0000000000'
125
- ].pack('H*')
126
- expect(message.target_info).to eq(ti)
127
- end
128
-
129
- end
130
- end
131
-
132
- end
1
+ # encoding: UTF-8
2
+ require 'spec_helper'
3
+
4
+ describe Net::NTLM::Message::Type2 do
5
+
6
+ fields = [
7
+ { :name => :sign, :class => Net::NTLM::String, :value => Net::NTLM::SSP_SIGN, :active => true },
8
+ { :name => :type, :class => Net::NTLM::Int32LE, :value => 2, :active => true },
9
+ { :name => :challenge, :class => Net::NTLM::Int64LE, :value => 0, :active => true },
10
+ { :name => :context, :class => Net::NTLM::Int64LE, :value => 0, :active => false },
11
+ { :name => :flag, :class => Net::NTLM::Int32LE, :value => Net::NTLM::DEFAULT_FLAGS[:TYPE2], :active => true },
12
+ { :name => :target_name, :class => Net::NTLM::SecurityBuffer, :value => '', :active => true },
13
+ { :name => :target_info, :class => Net::NTLM::SecurityBuffer, :value => '', :active => false },
14
+ { :name => :os_version, :class => Net::NTLM::String, :value => '', :active => false },
15
+ ]
16
+ flags = [
17
+ :UNICODE
18
+ ]
19
+ it_behaves_like 'a fieldset', fields
20
+ it_behaves_like 'a message', flags
21
+
22
+ let(:type2_packet) {"TlRMTVNTUAACAAAAHAAcADgAAAAFgooCJ+UA1//+ZM4AAAAAAAAAAJAAkABUAAAABgGxHQAAAA9WAEEARwBSAEEATgBUAC0AMgAwADAAOABSADIAAgAcAFYAQQBHAFIAQQBOAFQALQAyADAAMAA4AFIAMgABABwAVgBBAEcAUgBBAE4AVAAtADIAMAAwADgAUgAyAAQAHAB2AGEAZwByAGEAbgB0AC0AMgAwADAAOABSADIAAwAcAHYAYQBnAHIAYQBuAHQALQAyADAAMAA4AFIAMgAHAAgAZBMdFHQnzgEAAAAA"}
23
+ let(:type3_packet) {"TlRMTVNTUAADAAAAGAAYAEQAAADAAMAAXAAAAAAAAAAcAQAADgAOABwBAAAUABQAKgEAAAAAAAA+AQAABYKKAgAAAADVS27TfQGmWxSSbXmolTUQyxJmD8ISQuBKKHFKC8GksUZISYc8Ps9RAQEAAAAAAAAANasTdCfOAcsSZg/CEkLgAAAAAAIAHABWAEEARwBSAEEATgBUAC0AMgAwADAAOABSADIAAQAcAFYAQQBHAFIAQQBOAFQALQAyADAAMAA4AFIAMgAEABwAdgBhAGcAcgBhAG4AdAAtADIAMAAwADgAUgAyAAMAHAB2AGEAZwByAGEAbgB0AC0AMgAwADAAOABSADIABwAIAGQTHRR0J84BAAAAAAAAAAB2AGEAZwByAGEAbgB0AGsAbwBiAGUALgBsAG8AYwBhAGwA"}
24
+
25
+ it 'should deserialize' do
26
+ t2 = Net::NTLM::Message.decode64(type2_packet)
27
+ expect(t2.class).to eq(Net::NTLM::Message::Type2)
28
+ expect(t2.challenge).to eq(14872292244261496103)
29
+ expect(t2.context).to eq(0)
30
+ expect(t2.flag).to eq(42631685)
31
+ expect(t2.os_version).to eq(['0601b11d0000000f'].pack('H*'))
32
+ expect(t2.sign).to eq("NTLMSSP\0")
33
+
34
+ t2_target_info = Net::NTLM::EncodeUtil.decode_utf16le(t2.target_info)
35
+ if RUBY_VERSION == "1.8.7"
36
+ expect(t2_target_info).to eq("\x02\x1CVAGRANT-2008R2\x01\x1CVAGRANT-2008R2\x04\x1Cvagrant-2008R2\x03\x1Cvagrant-2008R2\a\b\e$(D+&\e(B\0\0")
37
+ else
38
+ expect(t2_target_info).to eq("\u0002\u001CVAGRANT-2008R2\u0001\u001CVAGRANT-2008R2\u0004\u001Cvagrant-2008R2\u0003\u001Cvagrant-2008R2\a\b፤ᐝ❴ǎ\0\0")
39
+ end
40
+
41
+ expect(Net::NTLM::EncodeUtil.decode_utf16le(t2.target_name)).to eq("VAGRANT-2008R2")
42
+ expect(t2.type).to eq(2)
43
+ end
44
+
45
+ it 'should serialize' do
46
+ source = Net::NTLM::Message.decode64(type2_packet)
47
+
48
+ t2 = Net::NTLM::Message::Type2.new
49
+ t2.challenge = source.challenge
50
+ t2.context = source.context
51
+ t2.flag = source.flag
52
+ t2.os_version = source.os_version
53
+ t2.sign = source.sign
54
+ t2.target_info = source.target_info
55
+ t2.target_name = source.target_name
56
+ t2.type = source.type
57
+ t2.enable(:context)
58
+ t2.enable(:target_info)
59
+ t2.enable(:os_version)
60
+
61
+ expect(t2.encode64).to eq(type2_packet)
62
+ end
63
+
64
+ it 'should generate a type 3 response' do
65
+ t2 = Net::NTLM::Message.decode64(type2_packet)
66
+
67
+ type3_known = Net::NTLM::Message.decode64(type3_packet)
68
+ type3_known.flag = 0x028a8205
69
+ type3_known.enable(:session_key)
70
+ type3_known.enable(:flag)
71
+
72
+ t3 = t2.response({:user => 'vagrant', :password => 'vagrant', :domain => ''}, {:ntlmv2 => true, :workstation => 'kobe.local'})
73
+ expect(t3.domain).to eq(type3_known.domain)
74
+ expect(t3.flag).to eq(type3_known.flag)
75
+ expect(t3.sign).to eq("NTLMSSP\0")
76
+ expect(t3.workstation).to eq("k\0o\0b\0e\0.\0l\0o\0c\0a\0l\0")
77
+ expect(t3.user).to eq("v\0a\0g\0r\0a\0n\0t\0")
78
+ expect(t3.session_key).to eq('')
79
+ end
80
+
81
+ it 'should upcase domain when provided' do
82
+ t2 = Net::NTLM::Message.decode64(type2_packet)
83
+ t3 = t2.response({:user => 'vagrant', :password => 'vagrant', :domain => 'domain'}, {:ntlmv2 => true, :workstation => 'kobe.local'})
84
+ expect(t3.domain).to eq("D\0O\0M\0A\0I\0N\0")
85
+ end
86
+
87
+ describe '.parse' do
88
+ subject(:message) { described_class.parse(data) }
89
+ # http://davenport.sourceforge.net/ntlm.html#appendixC7
90
+ context 'NTLM2 Session Response Authentication; NTLM2 Signing and Sealing Using the 128-bit NTLM2 Session Response User Session Key With Key Exchange Negotiated' do
91
+ let(:data) do
92
+ [
93
+ '4e544c4d53535000020000000c000c0030000000358289e0677f1c557a5ee96c' \
94
+ '0000000000000000460046003c00000054004500530054004e00540002000c00' \
95
+ '54004500530054004e00540001000c004d0045004d0042004500520003001e00' \
96
+ '6d0065006d006200650072002e0074006500730074002e0063006f006d000000' \
97
+ '0000'
98
+ ].pack('H*')
99
+ end
100
+
101
+ it 'should set the magic' do
102
+ expect(message.sign).to eql(Net::NTLM::SSP_SIGN)
103
+ end
104
+ it 'should set the type' do
105
+ expect(message.type).to eq(2)
106
+ end
107
+ it 'should set the target name' do
108
+ # TESTNT
109
+ expect(message.target_name).to eq(["54004500530054004e005400"].pack('H*'))
110
+ end
111
+ it 'should set the flags' do
112
+ expect(message.flag).to eq(0xe0898235)
113
+ end
114
+ it 'should set the challenge' do
115
+ expect(message.challenge).to eq(0x6ce95e7a551c7f67)
116
+ end
117
+ it 'should set an empty context' do
118
+ expect(message.context).to be_zero
119
+ end
120
+ it 'should set target info' do
121
+ ti = [
122
+ '02000c0054004500530054004e00540001000c004d0045004d00420045005200' \
123
+ '03001e006d0065006d006200650072002e0074006500730074002e0063006f00' \
124
+ '6d0000000000'
125
+ ].pack('H*')
126
+ expect(message.target_info).to eq(ti)
127
+ end
128
+
129
+ end
130
+ end
131
+
132
+ end