class ASN1::Buffer

Constants

READABLE

Attributes

buffer[R]

Public Class Methods

be_decode(s) click to toggle source
# File lib/asn1-pure.rb, line 76
def self.be_decode(s)
  ret = 0
  s.each_byte do |b|
    ret = (ret << 8) + b
  end
  ret
end
new(s = String.new) click to toggle source
# File lib/asn1-pure.rb, line 37
def initialize(s = String.new)
  @buffer = s
  @pos = 0
end
oid_print(s) click to toggle source
# File lib/asn1-pure.rb, line 64
def self.oid_print(s)
  bu = Buffer.new(s)
  a = []
  while !bu.done
    a << bu.decode_sdnv
  end
  ia = a[0]
  ia1 = [a[0]/40, 2].min
  a[0..0] = [ia1, ia - 40 * ia1]
  a.join(".")
end

Public Instance Methods

atleast(n) click to toggle source
# File lib/asn1-pure.rb, line 42
def atleast(n)
  left = @buffer.bytesize - @pos
  raise OutOfBytesError.new(n - left) if n > left
end
decode_item() click to toggle source
# File lib/asn1-pure.rb, line 104
def decode_item
  ib = take(1).ord
  cons = ib & 0x20
  tag = decode_sdnv if (tag = ib & 0x1f) == 0x1f
  case len = take(1).ord
  when 0..127
  when 128
    len = false               # indefinite
  when 255
    fail "reserved length @pos"
  else
    len = be_decode(take(len - 128))
  end
  rtag, rproc = READABLE[[ib, tag]]
  if cons != 0
    nest = []
    if len
      limit = @pos + len
      while @pos < limit
        nest << decode_item
      end
    else
      while (a = decode_item
             if a != [0, 0, ""]
               nest << a
             end)
        ;
      end
      fail "no indef yet @pos"
    end
    fail [@pos, limit].inspect if @pos != limit
  else
    nest = take(len)
  end
  rproc ? rproc.(nest) : {rtag => nest}
end
decode_item_final() click to toggle source
# File lib/asn1-pure.rb, line 141
def decode_item_final
  val = decode_item
  raise "extra bytes follow after a deserialized object" if @pos != @buffer.size
  val
end
decode_item_with_rest() click to toggle source
# File lib/asn1-pure.rb, line 147
def decode_item_with_rest
  val = decode_item
  [val, @buffer[@pos..-1]]
end
decode_items() click to toggle source
# File lib/asn1-pure.rb, line 156
def decode_items
  ret = []
  while @pos != buffer.size
    ret << decode_item
  end
  ret
end
decode_sdnv() click to toggle source
# File lib/asn1-pure.rb, line 54
def decode_sdnv
  res = 0
  while (b = take(1).ord
         res = (res << 7) + (b & 0x7f)
         (b & 0x80) != 0)
    ;
  end
  res
end
done() click to toggle source
# File lib/asn1-pure.rb, line 152
def done
  @pos == buffer.size
end
take(n) click to toggle source
# File lib/asn1-pure.rb, line 47
def take(n)
  opos = @pos
  @pos += n
  raise OutOfBytesError.new(@pos - @buffer.bytesize) if @pos > @buffer.bytesize
  @buffer[opos, n]
end