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