thekuwayama/tttls1.3

View on GitHub
lib/tttls1.3/message/certificate_verify.rb

Summary

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

module TTTLS13
  using Refinements
  module Message
    class CertificateVerify
      attr_reader :msg_type
      attr_reader :signature_scheme
      attr_reader :signature

      # @param signature_scheme [TTTLS13::SignatureScheme]
      # @param signature [String]
      #
      # @raise [TTTLS13::Error::ErrorAlerts]
      def initialize(signature_scheme:, signature:)
        @msg_type = HandshakeType::CERTIFICATE_VERIFY
        @signature_scheme = signature_scheme
        @signature = signature
        raise Error::ErrorAlerts, :internal_error \
          if @signature.length > 2**16 - 1
      end

      # @return [String]
      def serialize
        binary = ''
        binary += @signature_scheme
        binary += @signature.prefix_uint16_length

        @msg_type + binary.prefix_uint24_length
      end

      alias fragment serialize

      # @param binary [String]
      #
      # @raise [TTTLS13::Error::ErrorAlerts]
      #
      # @return [TTTLS13::Message::CertificateVerify]
      def self.deserialize(binary)
        raise Error::ErrorAlerts, :internal_error if binary.nil?
        raise Error::ErrorAlerts, :decode_error if binary.length < 8
        raise Error::ErrorAlerts, :internal_error \
          unless binary[0] == HandshakeType::CERTIFICATE_VERIFY

        msg_len = Convert.bin2i(binary.slice(1, 3))
        signature_scheme = binary.slice(4, 2)
        signature_len = Convert.bin2i(binary.slice(6, 2))
        signature = binary.slice(8, signature_len)
        raise Error::ErrorAlerts, :decode_error \
          unless signature_len + 4 == msg_len &&
                 signature_len + 8 == binary.length

        CertificateVerify.new(signature_scheme: signature_scheme,
                              signature: signature)
      end
    end
  end
end