class TTTLS13::Message::Extension::OCSPStatusRequest

Attributes

extension_type[R]
request_extensions[R]
responder_id_list[R]

Public Class Methods

deserialize(binary) click to toggle source

@param binary [String]

@raise [TTTLS13::Error::ErrorAlerts]

@return [TTTLS13::Message::Extension::OCSPStatusRequest, nil] rubocop: disable Metrics/CyclomaticComplexity rubocop: disable Metrics/PerceivedComplexity

# File lib/tttls1.3/message/extension/status_request.rb, line 48
def self.deserialize(binary)
  raise Error::ErrorAlerts, :internal_error if binary.nil?
  return nil if binary.length < 5 ||
                binary[0] != CertificateStatusType::OCSP

  ril_len = Convert.bin2i(binary.slice(1, 2))
  i = 3
  responder_id_list =
    deserialize_request_ids(binary.slice(i, ril_len))
  # unparsable responder_id_list
  return nil if responder_id_list.nil?

  i += ril_len
  return nil if i + 2 > binary.length

  re_len = Convert.bin2i(binary.slice(i, 2))
  i += 2
  exs_bin = binary.slice(i, re_len)
  begin
    request_extensions = OpenSSL::ASN1.decode_all(exs_bin)
  rescue OpenSSL::ASN1::ASN1Error
    return nil
  end
  i += re_len
  return nil unless i == binary.length

  OCSPStatusRequest.new(responder_id_list: responder_id_list,
                        request_extensions: request_extensions)
end
new(responder_id_list: [], request_extensions: []) click to toggle source

@param responder_id_list [Array of OpenSSL::ASN1::ASN1Data] @param request_extensions [Array of OpenSSL::ASN1::ASN1Data]

@example

OCSPStatusRequest.new
# File lib/tttls1.3/message/extension/status_request.rb, line 22
def initialize(responder_id_list: [], request_extensions: [])
  @extension_type = ExtensionType::STATUS_REQUEST
  @responder_id_list = responder_id_list || []
  @request_extensions = request_extensions || []
end

Private Class Methods

deserialize_request_ids(binary) click to toggle source

@param binary [String]

@raise [TTTLS13::Error::ErrorAlerts]

@return [Array of ASN1Data, nil] received unparsable binary, nil

# File lib/tttls1.3/message/extension/status_request.rb, line 88
def deserialize_request_ids(binary)
  raise Error::ErrorAlerts, :internal_error if binary.nil?

  i = 0
  request_ids = []
  while i < binary.length
    return nil if i + 2 > binary.length

    id_len = Convert.bin2i(binary.slice(i, 2))
    i += 2
    id = binary.slice(i, id_len)
    begin
      request_ids += OpenSSL::ASN1.decode(id)
    rescue OpenSSL::ASN1::ASN1Error
      return nil
    end
    i += id_len
  end
  return nil if i != binary.length

  request_ids
end

Public Instance Methods

serialize() click to toggle source

@return [String]

# File lib/tttls1.3/message/extension/status_request.rb, line 29
def serialize
  binary = ''
  binary += CertificateStatusType::OCSP
  binary += @responder_id_list.length.to_uint16
  binary += @responder_id_list.map do |id|
    id.to_der.prefix_uint16_length
  end.join
  binary += @request_extensions.map(&:to_der).join.prefix_uint16_length

  @extension_type + binary.prefix_uint16_length
end