Packages
comeonin
1.0.3
5.5.1
5.5.0
5.4.0
5.3.3
5.3.2
5.3.1
5.3.0
5.2.0
5.1.3
5.1.2
5.1.1
5.1.0
5.0.0
4.1.2
4.1.1
4.1.0
4.0.3
4.0.2
4.0.1
4.0.0
4.0.0-rc.0
3.2.0
3.1.0
3.0.2
3.0.1
3.0.0
2.6.0
2.5.3
2.5.2
2.5.1
2.5.0
2.4.0
2.3.1
2.3.0
2.2.0
2.1.1
2.1.0
2.0.3
2.0.2
2.0.1
2.0.0
1.6.0
1.5.0
1.4.1
1.4.0
1.3.2
1.3.1
1.3.0
1.2.2
1.2.1
1.2.0
1.1.4
1.1.3
1.1.2
1.1.1
1.1.0
1.0.5
1.0.4
1.0.3
1.0.2
1.0.1
1.0.0
0.11.3
0.11.2
0.11.1
0.11.0
0.10.0
0.9.0
0.8.2
0.8.1
0.8.0
0.7.0
0.6.0
0.5.1
0.5.0
0.4.0
0.3.1
0.3.0
0.2.4
0.2.3
0.2.2
0.2.1
0.2.0
0.1.1
0.1.0
A specification for password hashing libraries
Current section
Files
Jump to
Current section
Files
lib/comeonin/pbkdf2_base64.ex
defmodule Comeonin.Pbkdf2Base64 do
@moduledoc """
Module that provides base64 encoding for pbkdf2.
"""
import Bitwise
b64_alphabet = Enum.with_index 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789./'
for {encoding, value} <- b64_alphabet do
defp unquote(:enc64)(unquote(value)), do: unquote(encoding)
defp unquote(:dec64)(unquote(encoding)), do: unquote(value)
end
@doc """
Encode using an adapted base64 alphabet (using `.`
instead of `+` and with no padding).
## Examples
iex> Comeonin.Pbkdf2Base64.encode "spamandeggs"
"c3BhbWFuZGVnZ3M"
"""
def encode(<<>>), do: <<>>
def encode(data) do
split = 3 * div(byte_size(data), 3)
<<main::size(split)-binary, rest::binary>> = data
main = for <<c::6 <- main>>, into: <<>>, do: <<enc64(c)::8>>
case rest do
<<c1::6, c2::6, c3::4>> ->
<<main::binary, enc64(c1)::8, enc64(c2)::8, enc64(bsl(c3, 2))::8>>
<<c1::6, c2::2>> ->
<<main::binary, enc64(c1)::8, enc64(bsl(c2, 4))::8>>
<<>> ->
main
end
end
@doc """
Decode using an adapted base64 alphabet (using `.`
instead of `+` and with no padding).
## Examples
iex> Comeonin.Pbkdf2Base64.decode("c3BhbWFuZGVnZ3M")
"spamandeggs"
"""
def decode(<<>>), do: <<>>
def decode(data) do
split = 4 * div(byte_size(data), 4)
<<main::size(split)-binary, rest::binary>> = data
main = for <<c::8 <- main>>, into: <<>>, do: <<dec64(c)::6>>
case rest do
<<c1::8, c2::8>> ->
<<main::binary, dec64(c1)::6, bsr(dec64(c2), 4)::2>>
<<c1::8, c2::8, c3::8>> ->
<<main::binary, dec64(c1)::6, dec64(c2)::6, bsr(dec64(c3), 2)::4>>
<<>> ->
main
end
end
end