lib/rasn1.rb in rasn1-0.12.0 vs lib/rasn1.rb in rasn1-0.12.1

- old
+ new

@@ -3,40 +3,41 @@ require_relative 'rasn1/version' require_relative 'rasn1/errors' require_relative 'rasn1/types' require_relative 'rasn1/model' require_relative 'rasn1/wrapper' +require_relative 'rasn1/tracer' # Rasn1 is a pure ruby library to parse, decode and encode ASN.1 data. # @author Sylvain Daubert module RASN1 + # @private + CONTAINER_CLASSES = [Types::Sequence, Types::Set].freeze + # Parse a DER/BER string without checking a model # @note If you want to check ASN.1 grammary, you should define a {Model} # and use {Model#parse}. # @note This method will never decode SEQUENCE OF or SET OF objects, as these # ones use the same encoding as SEQUENCE and SET, respectively. # @note Real type of tagged value cannot be guessed. So, such tag will # generate {Types::Base} objects. # @param [String] der binary string to parse # @param [Boolean] ber if +true+, decode a BER string, else a DER one # @return [Types::Base] - def self.parse(der, ber: false) - root = nil - until der.empty? - type = Types.id2type(der) - type.parse!(der, ber: ber) - root ||= type + def self.parse(der, ber: false) # rubocop:disable Metrics:AbcSize + type = Types.id2type(der) + type.parse!(der, ber: ber) - if [Types::Sequence, Types::Set].include? type.class - subder = type.value - ary = [] - until subder.empty? - ary << self.parse(subder) - subder = subder[ary.last.to_der.size..-1] - end - type.value = ary + if CONTAINER_CLASSES.include?(type.class) + subder = type.value + ary = [] + RASN1.tracer.tracing_level += 1 unless RASN1.tracer.nil? + until subder.empty? + ary << self.parse(subder) + subder = subder[ary.last.to_der.size..-1] end - der = der[type.to_der.size..-1] + RASN1.tracer.tracing_level -= 1 unless RASN1.tracer.nil? + type.value = ary end - root + type end end