class TTTLS13::Message::Extension::SupportedVersions

Attributes

extension_type[R]
msg_type[RW]
versions[RW]

Public Class Methods

deserialize(binary, msg_type) click to toggle source

@param binary [String] @param msg_type [TTTLS13::Message::HandshakeType]

@raise [TTTLS13::Error::ErrorAlerts]

@return [TTTLS13::Message::Extensions::SupportedVersions, nil]

# File lib/tttls1.3/message/extension/supported_versions.rb, line 51
def self.deserialize(binary, msg_type)
  raise Error::ErrorAlerts, :internal_error if binary.nil?

  versions = []
  case msg_type
  when HandshakeType::CLIENT_HELLO
    versions = deserialize_versions(binary)
    return nil if versions.nil? # unparsable versions

  when HandshakeType::SERVER_HELLO, HandshakeType::HELLO_RETRY_REQUEST
    return nil if binary.length != 2

    versions << binary.slice(0, 2)
  else
    return nil
  end
  SupportedVersions.new(msg_type: msg_type, versions: versions)
end
deserialize_versions(binary) click to toggle source

@param binary [String]

@raise [TTTLS13::Error::ErrorAlerts]

@return [Array of String, nil] rubocop: disable Metrics/CyclomaticComplexity

# File lib/tttls1.3/message/extension/supported_versions.rb, line 76
def self.deserialize_versions(binary)
  raise Error::ErrorAlerts, :internal_error if binary.nil?

  return nil if binary.empty?

  versions_len = Convert.bin2i(binary[0])
  i = 1
  versions = []
  while i < versions_len + 1
    return nil if i + 2 > binary.length

    versions << binary.slice(i, 2)
    i += 2
  end
  return nil if i != binary.length || i != versions_len + 1

  versions
end
new(msg_type:, versions: DEFAULT_VERSIONS) click to toggle source

@param msg_type [TTTLS13::Message::ContentType] @param versions [Array of ProtocolVersion]

@raise [TTTLS13::Error::ErrorAlerts] rubocop: disable Metrics/CyclomaticComplexity

# File lib/tttls1.3/message/extension/supported_versions.rb, line 18
def initialize(msg_type:, versions: DEFAULT_VERSIONS)
  @extension_type = ExtensionType::SUPPORTED_VERSIONS
  @msg_type = msg_type
  @versions = versions || []
  case @msg_type
  when HandshakeType::CLIENT_HELLO
    raise Error::ErrorAlerts, :internal_error \
      if @versions.empty? || @versions.length > 127
  when HandshakeType::SERVER_HELLO, HandshakeType::HELLO_RETRY_REQUEST
    raise Error::ErrorAlerts, :internal_error \
      unless @versions.length == 1
  else
    raise Error::ErrorAlerts, :internal_error
  end
end

Public Instance Methods

serialize() click to toggle source

@return [String]

# File lib/tttls1.3/message/extension/supported_versions.rb, line 36
def serialize
  binary = ''
  binary += (@versions.length * 2).to_uint8 \
    if @msg_type == HandshakeType::CLIENT_HELLO
  binary += @versions.join

  @extension_type + binary.prefix_uint16_length
end