thekuwayama/tttls1.3

View on GitHub
lib/tttls1.3/message/extension/early_data_indication.rb

Summary

Maintainability
A
45 mins
Test Coverage
# encoding: ascii-8bit
# frozen_string_literal: true

module TTTLS13
  using Refinements
  module Message
    module Extension
      class EarlyDataIndication
        attr_reader :extension_type
        attr_reader :max_early_data_size

        # @param max_early_data_size [Integer, nil]
        #
        # @raise [TTTLS13::Error::ErrorAlerts]
        def initialize(max_early_data_size = nil)
          @extension_type = ExtensionType::EARLY_DATA
          @max_early_data_size = max_early_data_size
          raise Error::ErrorAlerts, :internal_error \
            unless @max_early_data_size.nil? || @max_early_data_size < 2**32
        end

        # @return [String]
        def serialize
          binary = ''
          binary = @max_early_data_size.to_uint32 \
            unless @max_early_data_size.nil?

          @extension_type + binary.prefix_uint16_length
        end

        # @param binary [String]
        # @param msg_type [TTTLS13::Message::ContentType]
        #
        # @raise [TTTLS13::Error::ErrorAlerts]
        #
        # @return [TTTLS13::Message::Extensions::EarlyDataIndication, nil]
        def self.deserialize(binary, msg_type)
          raise Error::ErrorAlerts, :internal_error if binary.nil?

          case msg_type
          when HandshakeType::CLIENT_HELLO, HandshakeType::ENCRYPTED_EXTENSIONS
            return nil unless binary.empty?

            max_early_data_size = nil
          when HandshakeType::NEW_SESSION_TICKET
            return nil unless binary.length == 4

            max_early_data_size = Convert.bin2i(binary)
          else
            raise Error::ErrorAlerts, :internal_error
          end

          EarlyDataIndication.new(max_early_data_size)
        end
      end
    end
  end
end