lib/ssh_scan/protocol.rb
require 'bindata'
require 'string_ext'
require 'json'
module SSHScan
# SSHv2 KexInit
class KeyExchangeInit < BinData::Record
endian :big
uint32 :packet_length
uint8 :padding_length, :initial_value => 4
uint8 :message_code, :initial_value => 20
string :cookie_string, :length => 16
uint32 :kex_algorithms_length
string :key_algorithms_string, :length => lambda {
self.kex_algorithms_length
}
uint32 :server_host_key_algorithms_length
string :server_host_key_algorithms_string, :length => lambda {
self.server_host_key_algorithms_length
}
uint32 :encryption_algorithms_client_to_server_length
string :encryption_algorithms_client_to_server_string, :length => lambda {
self.encryption_algorithms_client_to_server_length
}
uint32 :encryption_algorithms_server_to_client_length
string :encryption_algorithms_server_to_client_string, :length => lambda {
self.encryption_algorithms_server_to_client_length
}
uint32 :mac_algorithms_client_to_server_length
string :mac_algorithms_client_to_server_string, :length => lambda {
self.mac_algorithms_client_to_server_length
}
uint32 :mac_algorithms_server_to_client_length
string :mac_algorithms_server_to_client_string, :length => lambda {
self.mac_algorithms_server_to_client_length
}
uint32 :compression_algorithms_client_to_server_length
string :compression_algorithms_client_to_server_string, :length => lambda {
self.compression_algorithms_client_to_server_length
}
uint32 :compression_algorithms_server_to_client_length
string :compression_algorithms_server_to_client_string, :length => lambda {
self.compression_algorithms_server_to_client_length
}
uint32 :languages_client_to_server_length
string :languages_client_to_server_string, :length => lambda {
self.languages_client_to_server_length
}
uint32 :languages_server_to_client_length
string :languages_server_to_client_string, :length => lambda {
self.languages_server_to_client_length
}
uint8 :kex_first_packet_follows
uint32 :reserved
string :padding_string, :read_length => lambda {
self.padding_length
}
def cookie
self.cookie_string
end
def cookie=(string)
self.cookie_string = string
end
def padding
self.padding_string
end
def padding=(string)
self.padding_string = string
end
def key_algorithms
self.key_algorithms_string.split(",")
end
def parse_string_or_array(data)
case data
when String
string = data
when Array
string = data.join(",")
else
raise ArgumentError
end
return string
end
def key_algorithms=(data)
string = parse_string_or_array(data)
self.key_algorithms_string = string
self.kex_algorithms_length = string.size
recalc_packet_length
end
def server_host_key_algorithms
self.server_host_key_algorithms_string.split(",")
end
def server_host_key_algorithms=(data)
string = parse_string_or_array(data)
self.server_host_key_algorithms_string = string
self.server_host_key_algorithms_length = string.size
recalc_packet_length
end
def encryption_algorithms_client_to_server
self.encryption_algorithms_client_to_server_string.split(",")
end
def encryption_algorithms_client_to_server=(data)
string = parse_string_or_array(data)
self.encryption_algorithms_client_to_server_string = string
self.encryption_algorithms_client_to_server_length = string.size
recalc_packet_length
end
def encryption_algorithms_server_to_client
self.encryption_algorithms_server_to_client_string.split(",")
end
def encryption_algorithms_server_to_client=(data)
string = parse_string_or_array(data)
self.encryption_algorithms_server_to_client_string = string
self.encryption_algorithms_server_to_client_length = string.size
recalc_packet_length
end
def mac_algorithms_client_to_server
self.mac_algorithms_client_to_server_string.split(",")
end
def mac_algorithms_client_to_server=(data)
string = parse_string_or_array(data)
self.mac_algorithms_client_to_server_string = string
self.mac_algorithms_client_to_server_length = string.size
recalc_packet_length
end
def mac_algorithms_server_to_client
self.mac_algorithms_server_to_client_string.split(",")
end
def mac_algorithms_server_to_client=(data)
string = parse_string_or_array(data)
self.mac_algorithms_server_to_client_string = string
self.mac_algorithms_server_to_client_length = string.size
recalc_packet_length
end
def compression_algorithms_client_to_server
self.compression_algorithms_client_to_server_string.split(",")
end
def compression_algorithms_client_to_server=(data)
string = parse_string_or_array(data)
self.compression_algorithms_client_to_server_string = string
self.compression_algorithms_client_to_server_length = string.size
recalc_packet_length
end
def compression_algorithms_server_to_client
self.compression_algorithms_server_to_client_string.split(",")
end
def compression_algorithms_server_to_client=(data)
string = parse_string_or_array(data)
self.compression_algorithms_server_to_client_string = string
self.compression_algorithms_server_to_client_length = string.size
recalc_packet_length
end
def languages_client_to_server
self.languages_client_to_server_string.split(",")
end
def languages_client_to_server=(data)
string = parse_string_or_array(data)
self.languages_client_to_server_string = string
self.languages_client_to_server_length = string.size
recalc_packet_length
end
def languages_server_to_client
self.languages_server_to_client_string.split(",")
end
def languages_server_to_client=(data)
string = parse_string_or_array(data)
self.languages_server_to_client_string = string
self.languages_server_to_client_length = string.size
recalc_packet_length
end
def recalc_packet_length
self.packet_length = self.to_binary_s.size - self.padding_length
end
# Summarize as Hash
# @return [Hash] summary
def to_hash
{
:cookie => self.cookie.hexify,
:key_algorithms => key_algorithms,
:server_host_key_algorithms => server_host_key_algorithms,
:encryption_algorithms_client_to_server =>
encryption_algorithms_client_to_server,
:encryption_algorithms_server_to_client =>
encryption_algorithms_server_to_client,
:mac_algorithms_client_to_server => mac_algorithms_client_to_server,
:mac_algorithms_server_to_client => mac_algorithms_server_to_client,
:compression_algorithms_client_to_server =>
compression_algorithms_client_to_server,
:compression_algorithms_server_to_client =>
compression_algorithms_server_to_client,
:languages_client_to_server => languages_client_to_server,
:languages_server_to_client => languages_server_to_client,
}
end
# Generate a {SSHScan::KeyExchangeInit} object from given Ruby hash.
# @param opts [Hash] options
# @return [SSHScan::KeyExchangeInit] {SSHScan::KeyExchangeInit}
# instance initialized using passed opts
def self.from_hash(opts)
kex_init = SSHScan::KeyExchangeInit.new()
kex_init.cookie = opts[:cookie]
kex_init.padding = opts[:padding]
kex_init.key_algorithms = opts[:key_algorithms]
kex_init.server_host_key_algorithms = opts[:server_host_key_algorithms]
kex_init.encryption_algorithms_client_to_server =
opts[:encryption_algorithms_client_to_server]
kex_init.encryption_algorithms_server_to_client =
opts[:encryption_algorithms_server_to_client]
kex_init.mac_algorithms_client_to_server =
opts[:mac_algorithms_client_to_server]
kex_init.mac_algorithms_server_to_client =
opts[:mac_algorithms_server_to_client]
kex_init.compression_algorithms_client_to_server =
opts[:compression_algorithms_client_to_server]
kex_init.compression_algorithms_server_to_client =
opts[:compression_algorithms_server_to_client]
kex_init.languages_client_to_server = opts[:languages_client_to_server]
kex_init.languages_server_to_client = opts[:languages_server_to_client]
return kex_init
end
# Summarize as JSON
# @return [String] JSON representation for summary hash
def to_json
self.to_hash.to_json
end
end
end