class RASN1::Types::BitString

ASN.1 Bit String @author Sylvain Daubert

Constants

ID

BitString id value

Attributes

bit_length[W]

@param [Integer] bit_length @return [Integer]

Public Class Methods

new(value_or_options={}, options={}) click to toggle source

@overload initialize(options={})

@param [Hash] options
@option options [Object] :bit_length default bit_length value. Should be
  present if +:default+ is set

@overload initialize(value, options={})

@param [Object] value value to set for this ASN.1 object
@param [Hash] options
@option options [Object] :bit_length default bit_length value. Should be
  present if +:default+ is set

@see Base#initialize common options to all ASN.1 types

Calls superclass method
# File lib/rasn1/types/bit_string.rb, line 25
def initialize(value_or_options={}, options={})
  super
  if @default
    raise ASN1Error, "#{@name}: default bit length is not defined" if @options[:bit_length].nil?

    @default_bit_length = @options[:bit_length]
  end
  @bit_length = @options[:bit_length]
end

Public Instance Methods

bit_length() click to toggle source

Get bit length

# File lib/rasn1/types/bit_string.rb, line 36
def bit_length
  if @value.nil?
    @default_bit_length
  else
    @bit_length
  end
end
inspect(level=0) click to toggle source

@param [Integer] level @return [String]

# File lib/rasn1/types/bit_string.rb, line 46
def inspect(level=0)
  str = common_inspect(level)
  str << " #{value.inspect} (bit length: #{bit_length})"
end

Private Instance Methods

can_build?() click to toggle source
# File lib/rasn1/types/bit_string.rb, line 53
def can_build?
  !(!@default.nil? && (@value.nil? || (@value == @default) &&
                        (@bit_length == @default_bit_length))) &&
    !(optional? && @value.nil?)
end
der_to_value(der, ber: false) click to toggle source
# File lib/rasn1/types/bit_string.rb, line 82
def der_to_value(der, ber: false)
  unused, @value = der.unpack('CA*')
  @bit_length = @value.length * 8 - unused
end
value_to_der() click to toggle source
# File lib/rasn1/types/bit_string.rb, line 59
def value_to_der
  raise ASN1Error, "#{@name}: bit length is not set" if bit_length.nil?

  @value << "\x00" while @value.length * 8 < @bit_length
  @value.force_encoding('BINARY')

  if @value.length * 8 > @bit_length
    max_len = @bit_length / 8 + ((@bit_length % 8).positive? ? 1 : 0)
    @value = @value[0, max_len]
  end

  unused = @value.length * 8 - @bit_length
  der = [unused, @value].pack('CA*')

  if unused.positive?
    last_byte = @value[-1].unpack1('C')
    last_byte &= (0xff >> unused) << unused
    der[-1] = [last_byte].pack('C')
  end

  der
end