class RASN1::Types::Integer

ASN.1 Integer @author Sylvain Daubert

Constants

ID

Integer id value

Attributes

enum[R]

@return [Hash,nil]

Public Class Methods

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

@overload initialize(options={})

@option options [Hash] :enum enumeration hash. Keys are names, and values
  are integers.
@raise [EnumeratedError] +:default+ value is unknown when +:enum+ key is present

@overload initialize(value, options={})

@param [Object] value value to set for this ASN.1 object
@option options [Hash] :enum enumeration hash. Keys are names, and values
  are integers. This key is mandatory.
@raise [EnumeratedError] +:default+ value is unknown when +:enum+ key is present

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

Calls superclass method
# File lib/rasn1/types/integer.rb, line 24
def initialize(value_or_options={}, options={})
  super
  @enum = @options[:enum]

  return if @enum.nil?

  # To ensure @value has the correct type
  self.value = @value

  case @default
  when String, Symbol
    raise EnumeratedError, "#{@name}: unknwon enumerated default value #@{default}" unless @enum.key? @default
  when ::Integer
    raise EnumeratedError, "#{@name}: default value #@{default} not in enumeration" unless @enum.value? @default

    @default = @enum.key(@default)
  when nil
  else
    raise TypeError, "#{@name}: #{@default.class} not handled as default value"
  end
end

Public Instance Methods

to_i() click to toggle source

Integer value @return [Integer]

# File lib/rasn1/types/integer.rb, line 72
def to_i
  if @enum.nil?
    @value || @default || 0
  else
    @enum[@value || @default] || 0
  end
end
value=(val) click to toggle source

@param [Integer,String,Symbol,nil] v @return [String,Symbol,nil]

# File lib/rasn1/types/integer.rb, line 48
def value=(val)
  case val
  when String, Symbol
    raise EnumeratedError, "#{@name} has no :enum" if @enum.nil?
    raise EnumeratedError, "#{@name}: unknwon enumerated value #{val}" unless @enum.key? val

    @value = val
  when ::Integer
    if @enum.nil?
      @value = val
    elsif @enum.value? val
      @value = @enum.key(val)
    else
      raise EnumeratedError, "#{@name}: #{val} not in enumeration"
    end
  when nil
    @value = nil
  else
    raise EnumeratedError, "#{@name}: not in enumeration"
  end
end

Private Instance Methods

der_to_int_value(der, ber: false) click to toggle source
# File lib/rasn1/types/integer.rb, line 104
def der_to_int_value(der, ber: false)
  ary = der.unpack('C*')
  v = ary.reduce(0) { |len, b| (len << 8) | b }
  v = -((~v & ((1 << v.bit_length) - 1)) + 1) if ary[0] & 0x80 == 0x80
  v
end
der_to_value(der, ber: false) click to toggle source
# File lib/rasn1/types/integer.rb, line 111
def der_to_value(der, ber: false)
  @value = der_to_int_value(der, ber: ber)
  return if @enum.nil?

  @value = @enum.key(@value)
  raise EnumeratedError, "#{@name}: value #{v} not in enumeration" if @value.nil?
end
explicit_type() click to toggle source
# File lib/rasn1/types/integer.rb, line 119
def explicit_type
  self.class.new(name: @name, enum: @enum)
end
int_value_to_der(value=nil) click to toggle source
# File lib/rasn1/types/integer.rb, line 82
def int_value_to_der(value=nil)
  v = value || @value
  size = v.bit_length / 8 + ((v.bit_length % 8).positive? ? 1 : 0)
  size = 1 if size.zero?
  comp_value = v >= 0 ? v : (~(-v) + 1) & ((1 << (size * 8)) - 1)
  ary = comp_value.digits(256)
  # v is > 0 and its MSBit is 1. Add a 0 byte to mark it as positive
  ary << 0 if v.positive? && (v >> (size * 8 - 1) == 1)
  ary.reverse.pack('C*')
end
value_to_der() click to toggle source
# File lib/rasn1/types/integer.rb, line 93
def value_to_der
  case @value
  when String, Symbol
    int_value_to_der @enum[@value]
  when ::Integer
    int_value_to_der
  else
    raise TypeError, "#{@name}: #{@value.class} not handled"
  end
end