# -*- coding: binary -*- module Rex module Proto module Kerberos module Model # This class provides a representation of a Kerberos KDC-REQ (response) data # definition class KdcResponse < Element # @!attribute pvno # @return [Fixnum] The protocol version number attr_accessor :pvno # @!attribute msg_type # @return [Fixnum] The type of a protocol message attr_accessor :msg_type # @!attribute crealm # @return [String] The realm part of the client's principal identifier attr_accessor :crealm # @!attribute cname # @return [Rex::Proto::Kerberos::Model::PrincipalName] The name part of the client's principal identifier attr_accessor :cname # @!attribute ticket # @return [Rex::Proto::Kerberos::Model::Ticket] The issued ticket attr_accessor :ticket # @!attribute enc_part # @return [Rex::Proto::Kerberos::Model::EncryptedData] The encrypted part of the response attr_accessor :enc_part # Decodes the Rex::Proto::Kerberos::Model::KdcResponse from an input # # @param input [String, OpenSSL::ASN1::ASN1Data] the input to decode from # @return [self] if decoding succeeds # @raise [RuntimeError] if decoding doesn't succeed def decode(input) case input when String decode_string(input) when OpenSSL::ASN1::ASN1Data decode_asn1(input) else raise ::RuntimeError, 'Failed to decode KdcResponse, invalid input' end self end # Rex::Proto::Kerberos::Model::KdcResponse encoding isn't supported # # @raise [NotImplementedError] def encode raise ::NotImplementedError, 'KdcResponse encoding not supported' end private # Decodes a Rex::Proto::Kerberos::Model::KdcResponse from an String # # @param input [String] the input to decode from def decode_string(input) asn1 = OpenSSL::ASN1.decode(input) decode_asn1(asn1) end # Decodes a Rex::Proto::Kerberos::Model::KdcResponse # # @param input [OpenSSL::ASN1::ASN1Data] the input to decode from # @raise [RuntimeError] if decoding doesn't succeed def decode_asn1(input) input.value[0].value.each do |val| case val.tag when 0 self.pvno = decode_pvno(val) when 1 self.msg_type = decode_msg_type(val) when 3 self.crealm = decode_crealm(val) when 4 self.cname = decode_cname(val) when 5 self.ticket = decode_ticket(val) when 6 self.enc_part = decode_enc_part(val) else raise ::RuntimeError, 'Failed to decode KDC-RESPONSE SEQUENCE' end end end # Decodes the pvno from an OpenSSL::ASN1::ASN1Data # # @param input [OpenSSL::ASN1::ASN1Data] the input to decode from # @return [Fixnum] def decode_pvno(input) input.value[0].value.to_i end # Decodes the msg_type from an OpenSSL::ASN1::ASN1Data # # @param input [OpenSSL::ASN1::ASN1Data] the input to decode from # @return [Fixnum] def decode_msg_type(input) input.value[0].value.to_i end # Decodes the crealm field # # @param input [OpenSSL::ASN1::ASN1Data] the input to decode from # @return [String] def decode_crealm(input) input.value[0].value end # Decodes the cname field # # @param input [OpenSSL::ASN1::ASN1Data] the input to decode from # @return [Rex::Proto::Kerberos::Type::PrincipalName] def decode_cname(input) Rex::Proto::Kerberos::Model::PrincipalName.decode(input.value[0]) end # Decodes the ticket field # # @param input [OpenSSL::ASN1::ASN1Data] the input to decode from # @return [Rex::Proto::Kerberos::Type::Ticket] def decode_ticket(input) Rex::Proto::Kerberos::Model::Ticket.decode(input.value[0]) end # Decodes the enc_part # # @param input [OpenSSL::ASN1::ASN1Data] the input to decode from # @return [Rex::Proto::Kerberos::Model::EncryptedData] def decode_enc_part(input) Rex::Proto::Kerberos::Model::EncryptedData.decode(input.value[0]) end end end end end end