lib/rasn1.rb in rasn1-0.5.0 vs lib/rasn1.rb in rasn1-0.6.0

- old
+ new

@@ -27,6 +27,37 @@ class ChoiceError < RASN1::Error def message "CHOICE #@name: #chosen not set" end end + + # 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 + while der.size > 0 + type = Types.tag2type(der[0].ord) + type.parse!(der, ber: ber) + root = type if root.nil? + + if [Types::Sequence, Types::Set].include? type.class + subder = type.value + ary = [] + while subder.size > 0 + ary << self.parse(subder) + subder = subder[ary.last.to_der.size..-1] + end + type.value = ary + end + der = der[type.to_der.size..-1] + end + root + end end