diff --git a/lib/crypto/ssh.ex b/lib/crypto/ssh.ex index 987709a..6beaebf 100644 --- a/lib/crypto/ssh.ex +++ b/lib/crypto/ssh.ex @@ -206,9 +206,11 @@ defmodule Minisome.Crypto.SSH do @spec parse_keys(binary()) :: {:ok, [PublicKey.t()], binary()} | {:error, atom()} defp parse_keys(blob) - defp parse_keys( - <> - ) do + defp parse_keys(<< + key_blob_len::unsigned-integer-32, + key_blob::binary-size(key_blob_len), + rest::binary + >>) do case :ssh_file.decode(key_blob, :ssh2_pubkey) do {:error, _} -> {:error, :keys} keys when is_list(keys) -> {:ok, Enum.map(keys, &%PublicKey{data: &1}), rest} @@ -221,10 +223,11 @@ defmodule Minisome.Crypto.SSH do @spec parse_namespace(binary()) :: {:ok, binary(), binary()} | {:error, atom()} defp parse_namespace(blob) - defp parse_namespace( - <> - ), + defp parse_namespace(<< + namespace_len::unsigned-integer-32, + namespace::binary-size(namespace_len), + rest::binary + >>), do: {:ok, namespace, rest} defp parse_namespace(_), do: {:error, :namespace} @@ -232,9 +235,11 @@ defmodule Minisome.Crypto.SSH do @spec parse_reserved(binary()) :: {:ok, binary()} | {:error, atom()} defp parse_reserved(blob) - defp parse_reserved( - <> - ), + defp parse_reserved(<< + reserved_len::unsigned-integer-32, + _reserved::binary-size(reserved_len), + rest::binary + >>), do: {:ok, rest} defp parse_reserved(_), do: {:error, :reserved} @@ -242,7 +247,11 @@ defmodule Minisome.Crypto.SSH do @spec parse_hash(binary()) :: {:ok, hash_algo(), binary()} | {:error, atom()} defp parse_hash(blob) - defp parse_hash(<>) + defp parse_hash(<< + hash_len::unsigned-integer-32, + hash::binary-size(hash_len), + rest::binary + >>) when hash in ["sha256", "sha512"], do: {:ok, String.to_existing_atom(hash), rest}