Class: HPKE::HKDF

Inherits:
Object
  • Object
show all
Includes:
Util
Defined in:
lib/hpke/hkdf.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Util

#i2osp, #os2ip, #xor

Constructor Details

#initialize(kdf_id) ⇒ HKDF

Returns a new instance of HKDF.



13
14
15
16
17
18
19
20
21
22
23
24
25
# File 'lib/hpke/hkdf.rb', line 13

def initialize(kdf_id)
  case kdf_id
  when HPKE::HKDF_SHA256
    @digest = OpenSSL::Digest.new('SHA256')
  when HPKE::HKDF_SHA384
    @digest = OpenSSL::Digest.new('SHA384')
  when HPKE::HKDF_SHA512
    @digest = OpenSSL::Digest.new('SHA512')
  else
    raise Exception.new('Unknown hash algorithm')
  end
  @kdf_id = kdf_id
end

Instance Attribute Details

#kdf_idObject (readonly)

Returns the value of attribute kdf_id.



7
8
9
# File 'lib/hpke/hkdf.rb', line 7

def kdf_id
  @kdf_id
end

Instance Method Details

#expand(prk, info, len) ⇒ Object



35
36
37
38
39
40
41
42
43
# File 'lib/hpke/hkdf.rb', line 35

def expand(prk, info, len)
  n = (len.to_f / @digest.digest_length).ceil
  t = ['']
  for i in 0..n do
    t << hmac(prk, t[i] + info + (i + 1).chr)
  end
  t_concat = t.join
  t_concat[0..(len - 1)]
end

#extract(salt, ikm) ⇒ Object



31
32
33
# File 'lib/hpke/hkdf.rb', line 31

def extract(salt, ikm)
  hmac(salt, ikm)
end

#hmac(key, data) ⇒ Object



27
28
29
# File 'lib/hpke/hkdf.rb', line 27

def hmac(key, data)
  OpenSSL::HMAC.digest(@digest, key, data)
end

#labeled_expand(prk, label, info, l, suite_id) ⇒ Object



50
51
52
53
# File 'lib/hpke/hkdf.rb', line 50

def labeled_expand(prk, label, info, l, suite_id)
  labeled_info = i2osp(l, 2) + 'HPKE-v1' + suite_id + label + info
  expand(prk, labeled_info, l)
end

#labeled_extract(salt, label, ikm, suite_id) ⇒ Object



45
46
47
48
# File 'lib/hpke/hkdf.rb', line 45

def labeled_extract(salt, label, ikm, suite_id)
  labeled_ikm = 'HPKE-v1' + suite_id + label + ikm
  extract(salt, labeled_ikm)
end

#n_hObject



9
10
11
# File 'lib/hpke/hkdf.rb', line 9

def n_h
  @digest.digest_length
end