Module: Noise::Functions::Hash

Defined in:
lib/noise/functions/hash.rb,
lib/noise/functions/hash/blake3.rb,
lib/noise/functions/hash/sha256.rb,
lib/noise/functions/hash/sha512.rb,
lib/noise/functions/hash/blake2b.rb,
lib/noise/functions/hash/blake2s.rb

Defined Under Namespace

Classes: Blake2b, Blake2bHMAC, Blake2s, Blake2sDigester, Blake2sHMAC, Blake3, Blake3HMAC, Sha256, Sha512

Class Method Summary collapse

Class Method Details

.create_hkdf_fn(digest) ⇒ Object



27
28
29
30
31
# File 'lib/noise/functions/hash.rb', line 27

def self.create_hkdf_fn(digest)
  lambda do |chaining_key, input_key_material, num_output|
    hkdf(chaining_key, input_key_material, num_output, digest)
  end
end

.hkdf(chaining_key, input_key_material, num_outputs, digest) ⇒ Object



33
34
35
36
37
38
39
40
41
# File 'lib/noise/functions/hash.rb', line 33

def self.hkdf(chaining_key, input_key_material, num_outputs, digest)
  temp_key = hmac_hash(chaining_key, input_key_material, digest)
  output1 = hmac_hash(temp_key, "\x01", digest)
  output2 = hmac_hash(temp_key, "#{output1}\u0002", digest)
  return [output1, output2] if num_outputs == 2

  output3 = hmac_hash(temp_key, "#{output2}\u0003", digest)
  [output1, output2, output3]
end

.hmac_hash(key, data, digest) ⇒ Object



12
13
14
15
16
17
18
19
20
21
22
23
24
25
# File 'lib/noise/functions/hash.rb', line 12

def self.hmac_hash(key, data, digest)
  case digest
  when /SHA/
    OpenSSL::HMAC.digest(OpenSSL::Digest.new(digest), key, data)
  when /BLAKE2b/
    Noise::Functions::Hash::Blake2bHMAC.new(key).update(data).digest
  when /BLAKE2s/
    Noise::Functions::Hash::Blake2sHMAC.new(key).update(data).digest
  when /BLAKE3/
    Noise::Functions::Hash::Blake3HMAC.new(key).update(data).digest
  else
    raise Noise::Exceptions::ProtocolNameError, "Unsupported hash function: #{digest}"
  end
end