class TTTLS13::Message::Certificate

Attributes

certificate_list[R]
certificate_request_context[R]
msg_type[R]

Public Class Methods

deserialize(binary) click to toggle source

@param binary [String]

@raise [TTTLS13::Error::ErrorAlerts]

@return [TTTLS13::Message::Certificate]

# File lib/tttls1.3/message/certificate.rb, line 44
def self.deserialize(binary)
  raise Error::ErrorAlerts, :internal_error if binary.nil?
  raise Error::ErrorAlerts, :decode_error if binary.length < 5
  raise Error::ErrorAlerts, :internal_error \
    unless binary[0] == HandshakeType::CERTIFICATE

  msg_len = Convert.bin2i(binary.slice(1, 3))
  crc_len = Convert.bin2i(binary.slice(4, 1))
  certificate_request_context = binary.slice(5, crc_len)
  i = 5 + crc_len
  cl_len = Convert.bin2i(binary.slice(i, 3))
  i += 3
  cl_bin = binary.slice(i, cl_len)
  i += cl_len
  certificate_list = deserialize_certificate_list(cl_bin)
  raise Error::ErrorAlerts, :decode_error unless i == msg_len + 4 &&
                                                 i == binary.length

  Certificate.new(
    certificate_request_context: certificate_request_context,
    certificate_list: certificate_list
  )
end
new(certificate_request_context: '', certificate_list: []) click to toggle source

@param certificate_request_context [String] @param certificate_list [Array of CertificateEntry]

# File lib/tttls1.3/message/certificate.rb, line 21
def initialize(certificate_request_context: '',
               certificate_list: [])
  @msg_type = HandshakeType::CERTIFICATE
  @certificate_request_context = certificate_request_context || ''
  @certificate_list = certificate_list || []
end

Private Class Methods

deserialize_certificate_list(binary) click to toggle source

@param binary [String]

@raise [TTTLS13::Error::ErrorAlerts]

@return [Array of CertificateEntry]

# File lib/tttls1.3/message/certificate.rb, line 87
def deserialize_certificate_list(binary)
  raise Error::ErrorAlerts, :internal_error if binary.nil?

  i = 0
  certificate_list = []
  while i < binary.length
    raise Error::ErrorAlerts, :decode_error if i + 3 > binary.length

    cd_len = Convert.bin2i(binary.slice(i, 3))
    i += 3
    cd_bin = binary.slice(i, cd_len)
    cert_data = OpenSSL::X509::Certificate.new(cd_bin)
    i += cd_len
    raise Error::ErrorAlerts, :decode_error if i + 2 > binary.length

    exs_len = Convert.bin2i(binary.slice(i, 2))
    i += 2
    exs_bin = binary.slice(i, exs_len)
    extensions = Extensions.deserialize(exs_bin,
                                        HandshakeType::CERTIFICATE)
    i += exs_len
    certificate_list << CertificateEntry.new(cert_data, extensions)
  end
  raise Error::ErrorAlerts, :decode_error unless i == binary.length

  certificate_list
end

Public Instance Methods

appearable_extensions?() click to toggle source

@return [Boolean]

# File lib/tttls1.3/message/certificate.rb, line 69
def appearable_extensions?
  cl_exs = @certificate_list.map do |e|
    e.instance_variable_get(:@extensions).keys
  end
  exs = cl_exs.uniq.flatten - APPEARABLE_CT_EXTENSIONS
  return true if exs.empty?

  !(exs - DEFINED_EXTENSIONS).empty?
end
fragment()
Alias for: serialize
serialize() click to toggle source

@return [String]

# File lib/tttls1.3/message/certificate.rb, line 29
def serialize
  binary = ''
  binary += @certificate_request_context.prefix_uint8_length
  binary += @certificate_list.map(&:serialize).join.prefix_uint24_length

  @msg_type + binary.prefix_uint24_length
end
Also aliased as: fragment