Module: CcipherFactory::SymKey

Extended by:
TR::CondUtils
Includes:
ShamirSharingHelper
Included in:
DerivedSymKey, SoftSymKey
Defined in:
lib/ccipher_factory/symkey/symkey.rb

Overview

Generic category to handle 4 types of symkey:

  • software internal generated symkey (key value is generated internally)

  • software external generated symkey (key value is being set by caller)

  • derived symkey (key value is derived from password)

  • hardware symkey (key value is stored in hardware and not going to be available)

Defined Under Namespace

Classes: SymKeyError

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from ShamirSharingHelper

#shamir_recover, #shamir_split

Instance Attribute Details

#keyObject

Raw key. It could be bytes or key object



43
44
45
# File 'lib/ccipher_factory/symkey/symkey.rb', line 43

def key
  @key
end

#keysizeObject

Key length in bits



40
41
42
# File 'lib/ccipher_factory/symkey/symkey.rb', line 40

def keysize
  @keysize
end

#keytypeObject

Symmetric key type. Supported key type refers CcipherFactory::SymKeyGenerator#supported_symkey



37
38
39
# File 'lib/ccipher_factory/symkey/symkey.rb', line 37

def keytype
  @keytype
end

Class Method Details

.from_encoded(bin, &block) ⇒ Object

Raises:



96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
# File 'lib/ccipher_factory/symkey/symkey.rb', line 96

def self.from_encoded(bin, &block)
  raise SymKeyError, "Input should not be empty" if is_empty?(bin)

  ts = BinStruct.instance.struct_from_bin(bin)
  case ts.oid
  when BTag.constant_value(:symkey_derived)
    DerivedSymKey.from_tspec(ts, &block)
  when BTag.constant_value(:symkey)
    SoftSymKey.from_tspec(ts, &block)
  else
    raise SymKeyError, "Unknown symkey envelope '#{ts.oid}'"
  end


  #case ts.id
  #when :symkey_derived
  #  DerivedSymKey.from_tspec(ts, &block)
  #when :symkey
  #  SoftSymKey.from_tspec(ts, &block)
  #else
  #  raise SymKeyError, "Unknown symkey envelope '#{ts.id}'"
  #end

end

Instance Method Details

#disposeObject



61
62
63
64
# File 'lib/ccipher_factory/symkey/symkey.rb', line 61

def dispose
  @key = nil
  GC.start
end

#initialize(keytype, keysize, key = nil) ⇒ Object



45
46
47
48
49
# File 'lib/ccipher_factory/symkey/symkey.rb', line 45

def initialize(keytype, keysize, key = nil)
  @keytype = keytype
  @keysize = keysize
  @key = key
end

#is_equals?(key) ⇒ Boolean

Returns:

  • (Boolean)


91
92
93
94
# File 'lib/ccipher_factory/symkey/symkey.rb', line 91

def is_equals?(key)
  comp = Ccrypto::UtilFactory.instance(:comparator)
  comp.is_equal?(@key, key)
end

#merge_key(shares) ⇒ Object

merge the splited share values into raw key value back



57
58
59
# File 'lib/ccipher_factory/symkey/symkey.rb', line 57

def merge_key(shares)
  @key = shamir_recover(shares)
end

#raw_keyObject



66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
# File 'lib/ccipher_factory/symkey/symkey.rb', line 66

def raw_key
  if not @key.nil?
    nativeHelper = Ccrypto::UtilFactory.instance(:native_helper)
    if @key.is_a?(String) or nativeHelper.is_byte_array?(@key)
      @key
    elsif @key.respond_to?(:to_bin)
      @key.to_bin
    else
      raise SymKeyError, "Not sure how to get raw_key for #{@key.inspect}"
    end
    #case @key
    #when String, ::Java::byte[]
    #  @key
    #else
    #  if @key.respond_to?(:to_bin)
    #    @key.to_bin
    #  else
    #    raise SymKeyError, "Not sure how to get raw_key for #{@key.inspect}"
    #  end
    #end
  else
    raise SymKeyError, "Key instance is nil. Cannot get raw_key from nil instance"
  end
end

#split_key(totalShare, reqShare, &block) ⇒ Object

split the raw key value into secret shares



52
53
54
# File 'lib/ccipher_factory/symkey/symkey.rb', line 52

def split_key(totalShare, reqShare, &block)
  shamir_split(@key, totalShare, reqShare)
end