Class: Epithet::Keygen

Inherits:
Object
  • Object
show all
Defined in:
lib/epithet.rb

Overview

Key derivation helper

Constant Summary collapse

DEFAULT_SCRYPT_PARAMS =

Default parameters for scrypt.

DEFAULT_SCRYPT_PARAMS = {
  salt: 'epithet-default',
  N: 1 << 17,
  r: 8,
  p: 1,
  length: 32
}.freeze
{
  salt: 'epithet-default',
  N: 1 << 17,
  r: 8,
  p: 1,
  length: 32
}.freeze

Instance Method Summary collapse

Constructor Details

#initialize(ikm: nil, passphrase: nil, digest: 'sha256', scrypt: {}) ⇒ Keygen

Create a new key generator from either high-entropy key material, or a supplied passphrase. Supplied scrypt params are merged over DEFAULT_SCRYPT_PARAMS.



213
214
215
216
217
218
219
220
221
# File 'lib/epithet.rb', line 213

def initialize(ikm: nil, passphrase: nil, digest: 'sha256', scrypt: {})
  if (passphrase.nil? && ikm.nil?) || (!passphrase.nil? && !ikm.nil?)
    raise ArgumentError, 'keygen requires either ikm or passphrase'
  end

  @ikm = (ikm ? ikm.b : OpenSSL::KDF.scrypt(passphrase, **DEFAULT_SCRYPT_PARAMS, **scrypt)).freeze
  @digest = -String(digest)
  freeze
end

Instance Method Details

#generate(info, salt, length) ⇒ Object

Derive a key via HKDF.



228
229
230
# File 'lib/epithet.rb', line 228

def generate(info, salt, length)
  OpenSSL::KDF.hkdf(@ikm, hash: @digest, info: info, salt: salt, length: length)
end

#inspectObject



223
224
225
# File 'lib/epithet.rb', line 223

def inspect
  "#<#{self.class}:#{'%#016x' % (object_id << 1)} digest=#{@digest}>"
end