Class: Epithet::Keygen
- Inherits:
-
Object
- Object
- Epithet::Keygen
- 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
-
#generate(info, salt, length) ⇒ Object
Derive a key via HKDF.
-
#initialize(ikm: nil, passphrase: nil, digest: 'sha256', scrypt: {}) ⇒ Keygen
constructor
Create a new key generator from either high-entropy key material, or a supplied passphrase.
- #inspect ⇒ Object
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.
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 |
#inspect ⇒ Object
233 234 235 |
# File 'lib/epithet.rb', line 233 def inspect "#<#{self.class}:#{'%#016x' % (object_id << 1)} digest=#{@digest}>" end |