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