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
}.freeze
{
  salt: 'epithet-default',
  N: 1 << 17,
  r: 8,
  p: 1
}.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, if any, are merged over DEFAULT_SCRYPT_PARAMS.

Raises:

  • (ArgumentError)


222
223
224
225
226
227
228
229
230
231
# File 'lib/epithet.rb', line 222

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
  raise ArgumentError, 'scrypt length is not configurable' if scrypt&.key?(:length)

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

Instance Method Details

#generate(info, salt, length) ⇒ Object

Derive a key via HKDF.



238
239
240
# File 'lib/epithet.rb', line 238

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

#inspectObject



233
234
235
# File 'lib/epithet.rb', line 233

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