class TTTLS13::Message::Extension::OfferedPsks

NOTE:

opaque PskBinderEntry<32..255>;

struct {
    PskIdentity identities<7..2^16-1>;
    PskBinderEntry binders<33..2^16-1>;
} OfferedPsks;

Attributes

binders[R]
identities[R]

Public Class Methods

deserialize(binary) click to toggle source

@param binary [String]

@return [TTTLS13::Message::Extensions::OfferedPsks, nil] rubocop: disable Metrics/AbcSize rubocop: disable Metrics/CyclomaticComplexity rubocop: disable Metrics/MethodLength rubocop: disable Metrics/PerceivedComplexity

# File lib/tttls1.3/message/extension/pre_shared_key.rb, line 126
def self.deserialize(binary)
  raise Error::ErrorAlerts, :internal_error if binary.nil?
  return nil if binary.length < 2

  pskids_len = Convert.bin2i(binary.slice(0, 2))
  i = 2
  identities = [] # Array of PskIdentity
  while i < pskids_len + 2
    return nil if i + 2 > binary.length

    id_len = Convert.bin2i(binary.slice(i, 2))
    return nil if id_len.zero?

    i += 2
    identity = binary.slice(i, id_len)
    i += id_len

    return nil if i + 4 > binary.length

    obfuscated_ticket_age = Convert.bin2i(binary.slice(i, 4))
    i += 4
    identities << PskIdentity.new(
      identity: identity,
      obfuscated_ticket_age: obfuscated_ticket_age
    )
  end

  i += 2
  binders = [] # Array of String
  while i < binary.length
    return nil if i > binary.length

    pbe_len = Convert.bin2i(binary[i])
    return nil if pbe_len < 32

    i += 1
    binders << binary.slice(i, pbe_len)
    i += pbe_len
  end
  return nil unless i == binary.length

  OfferedPsks.new(identities: identities, binders: binders)
end
new(identities: [], binders: []) click to toggle source

@param identities [Array of PskIdentity] @param binders [Array of String]

@raise [TTTLS13::Error::ErrorAlerts]

# File lib/tttls1.3/message/extension/pre_shared_key.rb, line 101
def initialize(identities: [], binders: [])
  @identities = identities || []
  @binders = binders || []
  raise Error::ErrorAlerts, :internal_error \
    if @identities.empty? || @binders.empty?
end

Public Instance Methods

serialize() click to toggle source

@return [String]

# File lib/tttls1.3/message/extension/pre_shared_key.rb, line 109
def serialize
  binary = @identities.map(&:serialize).join
  identities_bin = binary.prefix_uint16_length

  binary = @binders.map(&:prefix_uint8_length).join
  binders_bin = binary.prefix_uint16_length

  identities_bin + binders_bin
end