lib/kdf.ex

defmodule CA.KDF do

  def hl(:md5),    do: 16
  def hl(:sha),    do: 20
  def hl(:sha224), do: 28
  def hl(:sha256), do: 32
  def hl(:sha384), do: 48
  def hl(:sha512), do: 64

  def derive({_,h}, d, len, x) do
      :binary.part(:lists.foldr(fn i, a ->
          :crypto.hash(h, d <> <<i::32>> <> x) <> a
      end, <<>>, :lists.seq(1,round(Float.ceil(len/hl(h))))), 0, len)
  end

end