rubyntlm 0.6.1 → 0.6.2

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 +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,48 +1,48 @@
1
-
2
- module Net
3
- module NTLM
4
-
5
- class SecurityBuffer < FieldSet
6
-
7
- int16LE :length, {:value => 0}
8
- int16LE :allocated, {:value => 0}
9
- int32LE :offset, {:value => 0}
10
-
11
- attr_accessor :active
12
- def initialize(opts={})
13
- super()
14
- @value = opts[:value]
15
- @active = opts[:active].nil? ? true : opts[:active]
16
- @size = 8
17
- end
18
-
19
- def parse(str, offset=0)
20
- if @active and str.size >= offset + @size
21
- super(str, offset)
22
- @value = str[self.offset, self.length]
23
- @size
24
- else
25
- 0
26
- end
27
- end
28
-
29
- def serialize
30
- super if @active
31
- end
32
-
33
- def value
34
- @value
35
- end
36
-
37
- def value=(val)
38
- @value = val
39
- self.length = self.allocated = val.size
40
- end
41
-
42
- def data_size
43
- @active ? @value.size : 0
44
- end
45
- end
46
-
47
- end
1
+
2
+ module Net
3
+ module NTLM
4
+
5
+ class SecurityBuffer < FieldSet
6
+
7
+ int16LE :length, {:value => 0}
8
+ int16LE :allocated, {:value => 0}
9
+ int32LE :offset, {:value => 0}
10
+
11
+ attr_accessor :active
12
+ def initialize(opts={})
13
+ super()
14
+ @value = opts[:value]
15
+ @active = opts[:active].nil? ? true : opts[:active]
16
+ @size = 8
17
+ end
18
+
19
+ def parse(str, offset=0)
20
+ if @active and str.size >= offset + @size
21
+ super(str, offset)
22
+ @value = str[self.offset, self.length]
23
+ @size
24
+ else
25
+ 0
26
+ end
27
+ end
28
+
29
+ def serialize
30
+ super if @active
31
+ end
32
+
33
+ def value
34
+ @value
35
+ end
36
+
37
+ def value=(val)
38
+ @value = val
39
+ self.length = self.allocated = val.size
40
+ end
41
+
42
+ def data_size
43
+ @active ? @value.size : 0
44
+ end
45
+ end
46
+
47
+ end
48
48
  end
@@ -1,35 +1,35 @@
1
- module Net
2
- module NTLM
3
-
4
- class String < Field
5
- def initialize(opts)
6
- super(opts)
7
- @size = opts[:size]
8
- end
9
-
10
- def parse(str, offset=0)
11
- if @active and str.size >= offset + @size
12
- @value = str[offset, @size]
13
- @size
14
- else
15
- 0
16
- end
17
- end
18
-
19
- def serialize
20
- if @active
21
- @value.to_s
22
- else
23
- ""
24
- end
25
- end
26
-
27
- def value=(val)
28
- @value = val
29
- @size = @value.nil? ? 0 : @value.size
30
- @active = (@size > 0)
31
- end
32
- end
33
-
34
- end
1
+ module Net
2
+ module NTLM
3
+
4
+ class String < Field
5
+ def initialize(opts)
6
+ super(opts)
7
+ @size = opts[:size]
8
+ end
9
+
10
+ def parse(str, offset=0)
11
+ if @active and str.size >= offset + @size
12
+ @value = str[offset, @size]
13
+ @size
14
+ else
15
+ 0
16
+ end
17
+ end
18
+
19
+ def serialize
20
+ if @active
21
+ @value.to_s
22
+ else
23
+ ""
24
+ end
25
+ end
26
+
27
+ def value=(val)
28
+ @value = val
29
+ @size = @value.nil? ? 0 : @value.size
30
+ @active = (@size > 0)
31
+ end
32
+ end
33
+
34
+ end
35
35
  end
@@ -1,89 +1,89 @@
1
- module Net
2
- module NTLM
3
-
4
- # Represents a list of AV_PAIR structures
5
- # @see https://msdn.microsoft.com/en-us/library/cc236646.aspx
6
- class TargetInfo
7
-
8
- # Allowed AvId values for an AV_PAIR
9
- MSV_AV_EOL = "\x00\x00".freeze
10
- MSV_AV_NB_COMPUTER_NAME = "\x01\x00".freeze
11
- MSV_AV_NB_DOMAIN_NAME = "\x02\x00".freeze
12
- MSV_AV_DNS_COMPUTER_NAME = "\x03\x00".freeze
13
- MSV_AV_DNS_DOMAIN_NAME = "\x04\x00".freeze
14
- MSV_AV_DNS_TREE_NAME = "\x05\x00".freeze
15
- MSV_AV_FLAGS = "\x06\x00".freeze
16
- MSV_AV_TIMESTAMP = "\x07\x00".freeze
17
- MSV_AV_SINGLE_HOST = "\x08\x00".freeze
18
- MSV_AV_TARGET_NAME = "\x09\x00".freeze
19
- MSV_AV_CHANNEL_BINDINGS = "\x0A\x00".freeze
20
-
21
- # @param av_pair_sequence [String] AV_PAIR list from challenge message
22
- def initialize(av_pair_sequence)
23
- @av_pairs = read_pairs(av_pair_sequence)
24
- end
25
-
26
- attr_reader :av_pairs
27
-
28
- def to_s
29
- result = ''
30
- av_pairs.each do |k,v|
31
- result << k
32
- result << [v.length].pack('S')
33
- result << v
34
- end
35
- result << Net::NTLM::TargetInfo::MSV_AV_EOL
36
- result << [0].pack('S')
37
- result.force_encoding(Encoding::ASCII_8BIT)
38
- end
39
-
40
- private
41
-
42
- VALID_PAIR_ID = [
43
- MSV_AV_EOL,
44
- MSV_AV_NB_COMPUTER_NAME,
45
- MSV_AV_NB_DOMAIN_NAME,
46
- MSV_AV_DNS_COMPUTER_NAME,
47
- MSV_AV_DNS_DOMAIN_NAME,
48
- MSV_AV_DNS_TREE_NAME,
49
- MSV_AV_FLAGS,
50
- MSV_AV_TIMESTAMP,
51
- MSV_AV_SINGLE_HOST,
52
- MSV_AV_TARGET_NAME,
53
- MSV_AV_CHANNEL_BINDINGS
54
- ].freeze
55
-
56
- def read_pairs(av_pair_sequence)
57
- offset = 0
58
- result = {}
59
- return result if av_pair_sequence.nil?
60
-
61
- until offset >= av_pair_sequence.length
62
- id = av_pair_sequence[offset..offset+1]
63
-
64
- unless VALID_PAIR_ID.include?(id)
65
- raise Net::NTLM::InvalidTargetDataError.new(
66
- "Invalid AvId #{to_hex(id)} in AV_PAIR structure",
67
- av_pair_sequence
68
- )
69
- end
70
-
71
- length = av_pair_sequence[offset+2..offset+3].unpack('S')[0].to_i
72
- if length > 0
73
- value = av_pair_sequence[offset+4..offset+4+length-1]
74
- result[id] = value
75
- end
76
-
77
- offset += 4 + length
78
- end
79
-
80
- result
81
- end
82
-
83
- def to_hex(str)
84
- return nil if str.nil?
85
- str.bytes.map {|b| '0x' + b.to_s(16).rjust(2,'0').upcase}.join('-')
86
- end
87
- end
88
- end
89
- end
1
+ module Net
2
+ module NTLM
3
+
4
+ # Represents a list of AV_PAIR structures
5
+ # @see https://msdn.microsoft.com/en-us/library/cc236646.aspx
6
+ class TargetInfo
7
+
8
+ # Allowed AvId values for an AV_PAIR
9
+ MSV_AV_EOL = "\x00\x00".freeze
10
+ MSV_AV_NB_COMPUTER_NAME = "\x01\x00".freeze
11
+ MSV_AV_NB_DOMAIN_NAME = "\x02\x00".freeze
12
+ MSV_AV_DNS_COMPUTER_NAME = "\x03\x00".freeze
13
+ MSV_AV_DNS_DOMAIN_NAME = "\x04\x00".freeze
14
+ MSV_AV_DNS_TREE_NAME = "\x05\x00".freeze
15
+ MSV_AV_FLAGS = "\x06\x00".freeze
16
+ MSV_AV_TIMESTAMP = "\x07\x00".freeze
17
+ MSV_AV_SINGLE_HOST = "\x08\x00".freeze
18
+ MSV_AV_TARGET_NAME = "\x09\x00".freeze
19
+ MSV_AV_CHANNEL_BINDINGS = "\x0A\x00".freeze
20
+
21
+ # @param av_pair_sequence [String] AV_PAIR list from challenge message
22
+ def initialize(av_pair_sequence)
23
+ @av_pairs = read_pairs(av_pair_sequence)
24
+ end
25
+
26
+ attr_reader :av_pairs
27
+
28
+ def to_s
29
+ result = ''
30
+ av_pairs.each do |k,v|
31
+ result << k
32
+ result << [v.length].pack('S')
33
+ result << v
34
+ end
35
+ result << Net::NTLM::TargetInfo::MSV_AV_EOL
36
+ result << [0].pack('S')
37
+ result.force_encoding(Encoding::ASCII_8BIT)
38
+ end
39
+
40
+ private
41
+
42
+ VALID_PAIR_ID = [
43
+ MSV_AV_EOL,
44
+ MSV_AV_NB_COMPUTER_NAME,
45
+ MSV_AV_NB_DOMAIN_NAME,
46
+ MSV_AV_DNS_COMPUTER_NAME,
47
+ MSV_AV_DNS_DOMAIN_NAME,
48
+ MSV_AV_DNS_TREE_NAME,
49
+ MSV_AV_FLAGS,
50
+ MSV_AV_TIMESTAMP,
51
+ MSV_AV_SINGLE_HOST,
52
+ MSV_AV_TARGET_NAME,
53
+ MSV_AV_CHANNEL_BINDINGS
54
+ ].freeze
55
+
56
+ def read_pairs(av_pair_sequence)
57
+ offset = 0
58
+ result = {}
59
+ return result if av_pair_sequence.nil?
60
+
61
+ until offset >= av_pair_sequence.length
62
+ id = av_pair_sequence[offset..offset+1]
63
+
64
+ unless VALID_PAIR_ID.include?(id)
65
+ raise Net::NTLM::InvalidTargetDataError.new(
66
+ "Invalid AvId #{to_hex(id)} in AV_PAIR structure",
67
+ av_pair_sequence
68
+ )
69
+ end
70
+
71
+ length = av_pair_sequence[offset+2..offset+3].unpack('S')[0].to_i
72
+ if length > 0
73
+ value = av_pair_sequence[offset+4..offset+4+length-1]
74
+ result[id] = value
75
+ end
76
+
77
+ offset += 4 + length
78
+ end
79
+
80
+ result
81
+ end
82
+
83
+ def to_hex(str)
84
+ return nil if str.nil?
85
+ str.bytes.map {|b| '0x' + b.to_s(16).rjust(2,'0').upcase}.join('-')
86
+ end
87
+ end
88
+ end
89
+ end
@@ -1,11 +1,11 @@
1
- module Net
2
- module NTLM
3
- # @private
4
- module VERSION
5
- MAJOR = 0
6
- MINOR = 6
7
- TINY = 1
8
- STRING = [MAJOR, MINOR, TINY].join('.')
9
- end
10
- end
11
- end
1
+ module Net
2
+ module NTLM
3
+ # @private
4
+ module VERSION
5
+ MAJOR = 0
6
+ MINOR = 6
7
+ TINY = 2
8
+ STRING = [MAJOR, MINOR, TINY].join('.')
9
+ end
10
+ end
11
+ end
@@ -1,28 +1,29 @@
1
- require File.join(File.dirname(__FILE__), 'lib', 'net', 'ntlm', 'version')
2
-
3
- Gem::Specification.new do |s|
4
- s.platform = Gem::Platform::RUBY
5
- s.name = 'rubyntlm'
6
- s.version = Net::NTLM::VERSION::STRING
7
- s.summary = 'Ruby/NTLM library.'
8
- s.description = 'Ruby/NTLM provides message creator and parser for the NTLM authentication.'
9
-
10
- s.authors = ['Kohei Kajimoto','Paul Morton']
11
- s.email = ['koheik@gmail.com','paul.e.morton@gmail.com']
12
- s.homepage = 'https://github.com/winrb/rubyntlm'
13
-
14
-
15
- s.files = `git ls-files`.split($/)
16
- s.executables = s.files.grep(%r{^bin/}) { |f| File.basename(f) }
17
- s.test_files = s.files.grep(%r{^(test|spec|features)/})
18
- s.require_paths = ["lib"]
19
-
20
- s.required_ruby_version = '>= 1.8.7'
21
-
22
- s.license = 'MIT'
23
-
24
- s.add_development_dependency "pry"
25
- s.add_development_dependency "rake"
26
- s.add_development_dependency "rspec", ">= 2.11"
27
- s.add_development_dependency "simplecov"
28
- end
1
+ require File.join(File.dirname(__FILE__), 'lib', 'net', 'ntlm', 'version')
2
+
3
+ Gem::Specification.new do |s|
4
+ s.platform = Gem::Platform::RUBY
5
+ s.name = 'rubyntlm'
6
+ s.version = Net::NTLM::VERSION::STRING
7
+ s.summary = 'Ruby/NTLM library.'
8
+ s.description = 'Ruby/NTLM provides message creator and parser for the NTLM authentication.'
9
+
10
+ s.authors = ['Kohei Kajimoto','Paul Morton']
11
+ s.email = ['koheik@gmail.com','paul.e.morton@gmail.com']
12
+ s.homepage = 'https://github.com/winrb/rubyntlm'
13
+
14
+
15
+ s.files = `git ls-files`.split($/)
16
+ s.executables = s.files.grep(%r{^bin/}) { |f| File.basename(f) }
17
+ s.test_files = s.files.grep(%r{^(test|spec|features)/})
18
+ s.require_paths = ["lib"]
19
+
20
+ s.required_ruby_version = '>= 1.8.7'
21
+
22
+ s.license = 'MIT'
23
+
24
+ s.add_development_dependency 'github_changelog_generator', '1.14.3'
25
+ s.add_development_dependency "pry"
26
+ s.add_development_dependency "rake"
27
+ s.add_development_dependency "rspec", ">= 2.11"
28
+ s.add_development_dependency "simplecov"
29
+ end
@@ -1,16 +1,16 @@
1
- require 'spec_helper'
2
-
3
- describe Net::NTLM::Blob do
4
-
5
- fields = [
6
- { :name => :blob_signature, :class => Net::NTLM::Int32LE, :value => 257, :active => true },
7
- { :name => :reserved, :class => Net::NTLM::Int32LE, :value => 0, :active => true },
8
- { :name => :timestamp, :class => Net::NTLM::Int64LE, :value => 0, :active => true },
9
- { :name => :challenge, :class => Net::NTLM::String, :value => '', :active => true },
10
- { :name => :unknown1, :class => Net::NTLM::Int32LE, :value => 0, :active => true },
11
- { :name => :target_info, :class => Net::NTLM::String, :value => '', :active => true },
12
- { :name => :unknown2, :class => Net::NTLM::Int32LE, :value => 0, :active => true },
13
- ]
14
-
15
- it_behaves_like 'a fieldset', fields
16
- end
1
+ require 'spec_helper'
2
+
3
+ describe Net::NTLM::Blob do
4
+
5
+ fields = [
6
+ { :name => :blob_signature, :class => Net::NTLM::Int32LE, :value => 257, :active => true },
7
+ { :name => :reserved, :class => Net::NTLM::Int32LE, :value => 0, :active => true },
8
+ { :name => :timestamp, :class => Net::NTLM::Int64LE, :value => 0, :active => true },
9
+ { :name => :challenge, :class => Net::NTLM::String, :value => '', :active => true },
10
+ { :name => :unknown1, :class => Net::NTLM::Int32LE, :value => 0, :active => true },
11
+ { :name => :target_info, :class => Net::NTLM::String, :value => '', :active => true },
12
+ { :name => :unknown2, :class => Net::NTLM::Int32LE, :value => 0, :active => true },
13
+ ]
14
+
15
+ it_behaves_like 'a fieldset', fields
16
+ end