defmodule Frajtano.Proto do @agentc_request_identities 11 @agentc_sign_request 13 @agentc_remove_all_identities 19 @agentc_extension 27 @agent_failure 5 @agent_success 6 @agent_identities_answer 12 @agent_sign_response 14 @agent_extension_failure 28 @agent_extension_response 29 def encode({:agentc_request_identities, nil}), do: encode_packet(@agentc_request_identities, <<>>) def encode({:agentc_sign_request, {key, data, flags}}), do: encode_packet( @agentc_sign_request, <> ) def encode({:agentc_remove_all_identities, nil}), do: encode_packet(@agentc_remove_all_identities, <<>>) def encode({:agentc_extension, {type, data}}), do: encode_packet( @agentc_extension, <> ) def encode({:agent_failure, nil}), do: encode_packet(@agent_failure, <<>>) def encode({:agent_success, nil}), do: encode_packet(@agent_success, <<>>) def encode({:agent_identities_answer, keys}), do: encode_packet( @agent_identities_answer, < Enum.map_join(fn {key, comment} -> << byte_size(key)::big-integer-32, key::bytes, byte_size(comment)::big-integer-32, comment::bytes >> end)::bytes>> ) def encode({:agent_sign_response, signature}), do: encode_packet( @agent_sign_response, <> ) def encode({:agent_extension_failure, nil}), do: encode_packet(@agent_extension_failure, <<>>) def encode({:agent_extension_response, {type, data}}), do: encode_packet( @agent_extension_response, <> ) defp encode_packet(type, contents), do: <> def decode(packet) do case decode_packet(packet) do {{@agentc_request_identities, contents}, rest} -> {{:agentc_request_identities, decode_agentc_request_identities(contents)}, rest} {{@agentc_sign_request, contents}, rest} -> {{:agentc_sign_request, decode_agentc_sign_request(contents)}, rest} {{@agentc_remove_all_identities, contents}, rest} -> {{:agentc_remove_all_identities, decode_agentc_remove_all_identities(contents)}, rest} {{@agentc_extension, contents}, rest} -> {{:agentc_extension, decode_agentc_extension(contents)}, rest} {{@agent_failure, contents}, rest} -> {{:agent_failure, decode_agent_failure(contents)}, rest} {{@agent_success, contents}, rest} -> {{:agent_success, decode_agent_success(contents)}, rest} {{@agent_identities_answer, contents}, rest} -> {{:agent_identities_answer, decode_agent_identities_answer(contents)}, rest} {{@agent_sign_response, contents}, rest} -> {{:agent_sign_response, decode_agent_sign_response(contents)}, rest} {{@agent_extension_failure, contents}, rest} -> {{:agent_extension_failure, decode_agent_extension_failure(contents)}, rest} {{@agent_extension_response, contents}, rest} -> {{:agent_extension_response, decode_agent_extension_response(contents)}, rest} {nil, rest} -> {nil, rest} end end defp decode_packet( <> ), do: {{type, contents}, rest} defp decode_packet(rest), do: {nil, rest} defp decode_agentc_request_identities(<<>>), do: nil defp decode_agentc_sign_request( <> ), do: {key, data, flags} defp decode_agentc_remove_all_identities(<<>>), do: nil defp decode_agentc_extension( <> ), do: {type, contents} defp decode_agent_failure(<<>>), do: nil defp decode_agent_success(<<>>), do: nil defp decode_agent_identities_answer(<>) do lst = for <>, do: {key, comment} ^nkeys = length(lst) lst end defp decode_agent_sign_response(<>), do: sig defp decode_agent_extension_failure(<<>>), do: nil defp decode_agent_extension_response( <> ), do: {type, contents} end