1509aa8ef6
Some code has been removed. Version control is not synonymous with code storage - if you're not using it now, you probably don't have working tests and the code will be buggy anyway. Write it when you need it.
94 lines
2.9 KiB
Ruby
94 lines
2.9 KiB
Ruby
# NET::BER
|
|
# Mixes ASN.1/BER convenience methods into several standard classes.
|
|
# Also provides BER parsing functionality.
|
|
#
|
|
#----------------------------------------------------------------------------
|
|
#
|
|
# Copyright (C) 2006 by Francis Cianfrocca. All Rights Reserved.
|
|
#
|
|
# Gmail: garbagecat10
|
|
#
|
|
# This program is free software; you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation; either version 2 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program; if not, write to the Free Software
|
|
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
#
|
|
#---------------------------------------------------------------------------
|
|
|
|
module Net
|
|
module BER
|
|
|
|
#--
|
|
# This condenses our nicely self-documenting ASN hashes down
|
|
# to an array for fast lookups.
|
|
# Scoped to be called as a module method, but not intended for
|
|
# user code to call.
|
|
#
|
|
def self.compile_syntax(syn)
|
|
out = [nil] * 256
|
|
syn.each do |tclass, tclasses|
|
|
tagclass = {:universal=>0, :application=>64, :context_specific=>128, :private=>192} [tclass]
|
|
tclasses.each do |codingtype,codings|
|
|
encoding = {:primitive=>0, :constructed=>32} [codingtype]
|
|
codings.each {|tag, objtype| out[tagclass + encoding + tag] = objtype }
|
|
end
|
|
end
|
|
out
|
|
end
|
|
|
|
def to_ber
|
|
# Provisional implementation.
|
|
# We ASSUME that our incoming value is an array, and we
|
|
# use the Array#to_ber_oid method defined below.
|
|
# We probably should obsolete that method, actually, in
|
|
# and move the code here.
|
|
# WE ARE NOT CURRENTLY ENCODING THE BER-IDENTIFIER.
|
|
# This implementation currently hardcodes 6, the universal OID tag.
|
|
ary = @value.dup
|
|
first = ary.shift
|
|
raise Net::BER::BerError.new(" invalid OID" ) unless [0,1,2].include?(first)
|
|
first = first * 40 + ary.shift
|
|
ary.unshift first
|
|
oid = ary.pack("w*")
|
|
[6, oid.length].pack("CC") + oid
|
|
end
|
|
end
|
|
end
|
|
|
|
module Net
|
|
module BER
|
|
class BerError < StandardError; end
|
|
|
|
class BerIdentifiedString < String
|
|
attr_accessor :ber_identifier
|
|
def initialize args
|
|
super args
|
|
end
|
|
end
|
|
|
|
class BerIdentifiedArray < Array
|
|
attr_accessor :ber_identifier
|
|
def initialize(*args)
|
|
super
|
|
end
|
|
end
|
|
|
|
class BerIdentifiedNull
|
|
attr_accessor :ber_identifier
|
|
def to_ber
|
|
"\005\000"
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
require 'net/ber/ber_parser' |