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