module BER
Basic Encoding Rules
Refine Array
Refine FalseClass
Refine Integer
Refine IO
Refine ::OpenSSL::SSL::SSLSocket
Refine String
Refine StringIO
Refine TrueClass
Constants
- ASN_SYNTAX
- Error
- IDENTIFIED
- MAX_FIXNUM_SIZE
- Null
- VERSION
- WILDCARD
Public Class Methods
compile_syntax(syntax)
click to toggle source
# File lib/ber.rb, line 53 def self.compile_syntax(syntax) out = [nil] * 256 syntax.each do |tag_class_id, encodings| tag_class = config[:tag_class][tag_class_id] encodings.each do |encoding_id, classes| encoding = config[:encoding_type][encoding_id] object_class = tag_class + encoding classes.each do |number, object_type| out[object_class + number] = object_type end end end out end
config()
click to toggle source
@return [Hash]
@api private
# File lib/ber.rb, line 33 def self.config @config ||= YAML.load_file(root.join('ber.yaml')).freeze end
fetch(type, val)
click to toggle source
@param type [Symbol] (:response)
@param val [Integer, Symbol]
@return [Symbol, Integer]
@api private
# File lib/ber.rb, line 46 def self.fetch(type, val) case val when Integer then config[type][val] when Symbol then config[type].key(val) end end
function()
click to toggle source
# File lib/ber.rb, line 15 def self.function @function ||= Function.new end
root()
click to toggle source
Path to gem root
@return [Pathname]
@api private
# File lib/ber.rb, line 24 def self.root Pathname(File.dirname(__FILE__)) end
Public Instance Methods
ascii_encoded()
click to toggle source
# File lib/ber/refinements/string.rb, line 66 def ascii_encoded encode('UTF-8').force_encoding('ASCII-8BIT') rescue Encoding::UndefinedConversionError, Encoding::ConverterNotFoundError, Encoding::InvalidByteSequenceError self end
parse_ber_object(syntax, id, data)
click to toggle source
# File lib/ber/refinements/io.rb, line 15 def parse_ber_object(syntax, id, data) ::BER.function.parse_ber_object(self, syntax, id, data) end
read_ber(syntax = ::BER::ASN_SYNTAX)
click to toggle source
# File lib/ber/refinements/io.rb, line 7 def read_ber(syntax = ::BER::ASN_SYNTAX) ::BER.function.read_ber(self, syntax) end
read_ber!(syntax = ::BER::ASN_SYNTAX)
click to toggle source
# File lib/ber/refinements/string.rb, line 13 def read_ber!(syntax = ::BER::ASN_SYNTAX) io = ::StringIO.new(self) result = io.read_ber(syntax) slice!(0...io.pos) result end
read_ber_length()
click to toggle source
# File lib/ber/refinements/io.rb, line 11 def read_ber_length ::BER.function.read_ber_length(self) end
reject_empty_ber_arrays()
click to toggle source
# File lib/ber/refinements/string.rb, line 60 def reject_empty_ber_arrays gsub(/0\000/n, ::BER::EMPTY_STRING) end
to_ber(id = 0)
click to toggle source
48
# File lib/ber/refinements/array.rb, line 9 def to_ber(id = 0) to_ber_seq_internal(0x30 + id) end
to_ber_application(tag)
click to toggle source
@param tag [Integer]
@return [String]
@api private
# File lib/ber/refinements/integer.rb, line 35 def to_ber_application(tag) [0x40 + tag].pack('C') + to_ber_internal end
to_ber_application_string(code)
click to toggle source
@param code [String]
@return [String]
@api public
# File lib/ber/refinements/string.rb, line 52 def to_ber_application_string(code) to_ber(0x40 + code) end
to_ber_appsequence(id = 0)
click to toggle source
96
# File lib/ber/refinements/array.rb, line 23 def to_ber_appsequence(id = 0) to_ber_seq_internal(0x60 + id) end
to_ber_bin(code = 0x04)
click to toggle source
@param code [String] (0x04)
@return [String]
@api public
# File lib/ber/refinements/string.rb, line 43 def to_ber_bin(code = 0x04) [code].pack('C') + length.to_ber_length_encoding + self end
to_ber_contextspecific(id = 0)
click to toggle source
160
# File lib/ber/refinements/array.rb, line 29 def to_ber_contextspecific(id = 0) to_ber_seq_internal(0xa0 + id) end
to_ber_control()
click to toggle source
# File lib/ber/refinements/array.rb, line 44 def to_ber_control ary = self[0].is_a?(Array) ? self : [self] ary = ary.collect do |control_sequence| control_sequence.collect(&:to_ber).to_ber_sequence.reject_empty_ber_arrays end ary.to_ber_sequence.reject_empty_ber_arrays end
to_ber_enumerated()
click to toggle source
@return [String]
@api public
# File lib/ber/refinements/integer.rb, line 17 def to_ber_enumerated "\012#{to_ber_internal}" end
to_ber_internal()
click to toggle source
# File lib/ber/refinements/integer.rb, line 41 def to_ber_internal size = 1 size += 1 until ((negative? ? ~self : self) >> (size * 8)).zero? size += 1 if positive? && (self & (0x80 << (size - 1) * 8)).positive? size += 1 if negative? && (self & (0x80 << (size - 1) * 8)).zero? result = [size] while size.positive? result << ((self >> ((size - 1) * 8)) & 0xff) size -= 1 end result.pack('C*') end
to_ber_length_encoding()
click to toggle source
# File lib/ber/refinements/integer.rb, line 21 def to_ber_length_encoding if self <= 127 [self].pack('C') else i = [self].pack('N').sub(/^[\0]+/, ::BER::EMPTY_STRING) [0x80 + i.length].pack('C') + i end end
to_ber_oid()
click to toggle source
# File lib/ber/refinements/array.rb, line 33 def to_ber_oid ary = dup first = ary.shift raise BER::Error, '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
to_ber_seq_internal(code)
click to toggle source
# File lib/ber/refinements/array.rb, line 54 def to_ber_seq_internal(code) s = join [code].pack('C') + s.length.to_ber_length_encoding + s end
to_ber_set(id = 0)
click to toggle source
49
# File lib/ber/refinements/array.rb, line 17 def to_ber_set(id = 0) to_ber_seq_internal(0x31 + id) end