Sha256: 14551179a06afea80faf96e31edd8ace23a925d44659644f35322fa77c279ee0

Contents?: true

Size: 1.78 KB

Versions: 2

Compression:

Stored size: 1.78 KB

Contents

require_relative 'scrypt'
require_relative 'hkdf'
require_relative 'pbkdf2'

module CcipherFactory
  module KDF

    class KDFError < StandardError; end

    class KDFEngine; end

    def KDF.instance(eng = :scrypt, &block)
      kdf = KDFEngine.new

      case eng
      when :scrypt
        kdf.extend(Scrypt)
      when :hkdf
        kdf.extend(HKDF)
      when :pbkdf2
        kdf.extend(PBKDF2)
      else
        raise KDFError, "Unknown KDF engine '#{eng}'"
      end

      kdf
    end

    def self.supported_kdf_algo
      [:scrypt, :hkdf, :pbkdf2].freeze
    end

    def self.from_encoded(bin, &block)
      ts = BinStruct.instance.struct_from_bin(bin)
      from_tspec(ts, &block)
    end

    def self.from_tspec(ts, &block)
      case BTag.value_constant(ts.oid)
      when :kdf_scrypt
        kdf = KDFEngine.new
        kdf.extend(Scrypt)
        kdf.cost = ts.cost
        kdf.parallel = ts.parallel
        kdf.blocksize = ts.blocksize
        kdf.salt = ts.salt
        kdf.outByteLength = ts.outByteLength
        kdf.digest = Digest.from_encoded(ts.digest)
        kdf.attachedValue = ts.value
        kdf.derive_init
        kdf
      when :kdf_hkdf
        kdf = KDFEngine.new
        kdf.extend(HKDF)
        kdf.digestAlgo = BTag.value_constant(ts.digest)
        kdf.salt = ts.salt
        kdf.outByteLength = ts.outByteLength
        kdf.attachedValue = ts.value
        kdf.derive_init
      when :kdf_pbkdf2
        kdf = KDFEngine.new
        kdf.extend(PBKDF2)
        kdf.digestAlgo = BTag.value_constant(ts.digest)
        kdf.salt = ts.salt
        kdf.iter = ts.iterations
        kdf.outByteLength = ts.outByteLength
        kdf.attachedValue = ts.value
        kdf.derive_init
      else
        raise KDFError, "Unknown KDF envelope ID '#{ts.oid}'"
      end
    end

  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
ccipher_factory-0.1.2 lib/ccipher_factory/kdf/kdf.rb
ccipher_factory-0.1.1 lib/ccipher_factory/kdf/kdf.rb