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