thekuwayama/tttls1.3

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

Summary

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

module TTTLS13
  using Refinements
  module Message
    module Extension
      module CertificateCompressionAlgorithm
        ZLIB = "\x00\x01"
        # BROTLI = "\x00\x02" # UNSUPPORTED
        # ZSTD   = "\x00\x03" # UNSUPPORTED
      end

      # https://datatracker.ietf.org/doc/html/rfc8879
      class CompressCertificate
        attr_reader :extension_type
        attr_reader :algorithms

        # @param algorithms [Array of CertificateCompressionAlgorithm]
        #
        # @raise [TTTLS13::Error::ErrorAlerts]
        #
        # @example
        #   CompressCertificate([CertificateCompressionAlgorithm::ZLIB])
        def initialize(algorithms)
          @extension_type = ExtensionType::COMPRESS_CERTIFICATE
          @algorithms = algorithms || []
          raise Error::ErrorAlerts, :internal_error \
            if @algorithms.join.length < 2 ||
               @algorithms.join.length > 2**8 - 2
        end

        # @return [String]
        def serialize
          binary = @algorithms.join.prefix_uint8_length

          @extension_type + binary.prefix_uint16_length
        end

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

          return nil if binary.length < 3

          al_len = Convert.bin2i(binary.slice(0, 1))
          return nil if binary.length != al_len + 1

          CompressCertificate.new(binary.slice(1, al_len + 1).scan(/.{2}/m))
        end
      end
    end
  end
end