lib/ruby_smb/ntlm/client.rb in ruby_smb-3.3.10 vs lib/ruby_smb/ntlm/client.rb in ruby_smb-3.3.11

- old
+ new

@@ -1,78 +1,7 @@ module RubySMB::NTLM - module Message - def deflag - security_buffers.inject(head_size) do |cur, a| - a[1].offset = cur - cur += a[1].data_size - has_flag?(:UNICODE) ? cur + cur % 2 : cur - end - end - - def serialize - deflag - @alist.map { |n, f| f.serialize }.join + security_buffers.map { |n, f| f.value + (has_flag?(:UNICODE) ? "\x00".b * (f.value.length % 2) : '') }.join - end - end - class Client < Net::NTLM::Client - class Session < Net::NTLM::Client::Session - def authenticate! - calculate_user_session_key! - type3_opts = { - :lm_response => is_anonymous? ? "\x00".b : lmv2_resp, - :ntlm_response => is_anonymous? ? '' : ntlmv2_resp, - :domain => domain, - :user => username, - :workstation => workstation, - :flag => (challenge_message.flag & client.flags) - } - t3 = Net::NTLM::Message::Type3.create type3_opts - t3.extend(Message) - if negotiate_key_exchange? - t3.enable(:session_key) - rc4 = OpenSSL::Cipher.new("rc4") - rc4.encrypt - rc4.key = user_session_key - sk = rc4.update exported_session_key - sk << rc4.final - t3.session_key = sk - end - t3 - end - - def is_anonymous? - username == '' && password == '' - end - - private - - def use_oem_strings? - # @see https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-nlmp/99d90ff4-957f-4c8a-80e4-5bfe5a9a9832 - !challenge_message.has_flag?(:UNICODE) && challenge_message.has_flag?(:OEM) - end - - def ntlmv2_hash - @ntlmv2_hash ||= RubySMB::NTLM.ntlmv2_hash(username, password, domain, {:client_challenge => client_challenge, :unicode => !use_oem_strings?}) - end - - def calculate_user_session_key! - if is_anonymous? - # see MS-NLMP section 3.4 - @user_session_key = "\x00".b * 16 - else - @user_session_key = OpenSSL::HMAC.digest(OpenSSL::Digest::MD5.new, ntlmv2_hash, nt_proof_str) - end - end - end - - def init_context(resp = nil, channel_binding = nil) - if resp.nil? - @session = nil - type1_message - else - @session = Client::Session.new(self, Net::NTLM::Message.decode64(resp), channel_binding) - @session.authenticate! - end - end + # There was a bunch of code in here that was necessary in versions up to and including rubyntlm version 0.6.3. + # The class is kept because there are references to it that should be kept in place in case future alterations to + # rubyntlm are required. end end