class Net::NTLM::ChannelBinding

Attributes

acceptor_address_length[R]
acceptor_addrtype[R]
channel[R]
initiator_address_length[R]
initiator_addtype[R]
unique_prefix[R]

Public Class Methods

create(outer_channel) click to toggle source

Creates a ChannelBinding used for Extended Protection Authentication @see blogs.msdn.com/b/openspecification/archive/2013/03/26/ntlm-and-channel-binding-hash-aka-exteneded-protection-for-authentication.aspx

@param outer_channel [OpenSSL::X509::Certificate] Server certificate securing

the outer TLS channel

@return [NTLM::ChannelBinding] A ChannelBinding holding a token that can be

embedded in a {Type3} message
# File lib/net/ntlm/channel_binding.rb, line 12
def self.create(outer_channel)
  new(outer_channel)
end
new(outer_channel) click to toggle source

@param outer_channel [OpenSSL::X509::Certificate] Server certificate securing

the outer TLS channel
# File lib/net/ntlm/channel_binding.rb, line 18
def initialize(outer_channel)
  @channel = outer_channel
  @unique_prefix = 'tls-server-end-point'
  @initiator_addtype = 0
  @initiator_address_length = 0
  @acceptor_addrtype = 0
  @acceptor_address_length = 0
end

Public Instance Methods

application_data() click to toggle source
# File lib/net/ntlm/channel_binding.rb, line 55
def application_data
  @application_data ||= begin
    data = unique_prefix
    data << ':'
    data << channel_hash.digest
    data
  end
end
channel_binding_token() click to toggle source

Returns a channel binding hash acceptable for use as a AV_PAIR MsvAvChannelBindings

field value as specified in the NTLM protocol

@return [String] MD5 hash of #gss_channel_bindings_struct

# File lib/net/ntlm/channel_binding.rb, line 35
def channel_binding_token
  @channel_binding_token ||= OpenSSL::Digest::MD5.new(gss_channel_bindings_struct).digest
end
channel_hash() click to toggle source
# File lib/net/ntlm/channel_binding.rb, line 51
def channel_hash
  @channel_hash ||= OpenSSL::Digest::SHA256.new(channel.to_der)
end
gss_channel_bindings_struct() click to toggle source
# File lib/net/ntlm/channel_binding.rb, line 39
def gss_channel_bindings_struct
  @gss_channel_bindings_struct ||= begin
    token = [initiator_addtype].pack('I')
    token << [initiator_address_length].pack('I')
    token << [acceptor_addrtype].pack('I')
    token << [acceptor_address_length].pack('I')
    token << [application_data.length].pack('I')
    token << application_data
    token
  end
end