# File lib/net/ntlm_http.rb, line 668
        def response(arg, opt = {})
          usr = arg[:user]
          pwd = arg[:password]
          if usr.nil? or pwd.nil?
            raise ArgumentError, "user and password have to be supplied"
          end
          
          if opt[:workstation]
            ws = opt[:workstation]
          else
            ws = ""
          end
          
          if opt[:client_challenge]
            cc  = opt[:client_challenge]
          else
            cc = rand(MAX64)
          end
          cc = NTLM::pack_int64le(cc) if cc.is_a?(Integer)
          opt[:client_challenge] = cc

          if has_flag?(:OEM) and opt[:unicode]
            usr = NTLM::decode_utf16le(usr)
            pwd = NTLM::decode_utf16le(pwd)
            ws  = NTLM::decode_utf16le(ws)
            opt[:unicode] = false
          end

          if has_flag?(:UNICODE) and !opt[:unicode]
            usr = NTLM::encode_utf16le(usr)
            pwd = NTLM::encode_utf16le(pwd)
            ws  = NTLM::encode_utf16le(ws)
            opt[:unicode] = true
          end

          tgt = self.target_name
          ti = self.target_info

          chal = self[:challenge].serialize
          
          if opt[:ntlmv2]
            ar = {:ntlmv2_hash => NTLM::ntlmv2_hash(usr, pwd, tgt, opt), :challenge => chal, :target_info => ti}
            lm_res = NTLM::lmv2_response(ar, opt)
            ntlm_res = NTLM::ntlmv2_response(ar, opt)
          elsif has_flag?(:NTLM2_KEY)
            ar = {:ntlm_hash => NTLM::ntlm_hash(pwd, opt), :challenge => chal}
            lm_res, ntlm_res = NTLM::ntlm2_session(ar, opt)
          else
            lm_res = NTLM::lm_response(pwd, chal)
            ntlm_res = NTLM::ntlm_response(pwd, chal)
          end
          
          Type3.create({
                :lm_response => lm_res,
                :ntlm_response => ntlm_res,
                :domain => tgt,
            :user => usr,
            :workstation => ws,
            :flag => self.flag
          })
        end