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