Polyjuice Util v0.2.2 Polyjuice.Util.JSON View Source

JSON-related functions.

Link to this section Summary

Functions

Encode a value as canonical JSON.

Sign a JSON object.

Verify a signed JSON object.

Link to this section Functions

Link to this function

canonical_json(val)

View Source
canonical_json(
  val :: true | false | nil | integer() | String.t() | list() | map()
) :: {:ok, String.t()} | :error

Encode a value as canonical JSON.

See https://matrix.org/docs/spec/appendices#canonical-json for more information about canonical JSON.

Examples:

iex> Polyjuice.Util.JSON.canonical_json(%{"a" => true, "b" => false, "c" => nil, "d" => 42, "e" => [], "f" => %{}})
{:ok, "{\"a\":true,\"b\":false,\"c\":null,\"d\":42,\"e\":[],\"f\":{}}"}

iex> Polyjuice.Util.JSON.canonical_json(%{"本"=>2,"日"=>1})
{:ok, "{\"\":1,\"\":2}"}

iex> Polyjuice.Util.JSON.canonical_json("a日\t\"\\\x01\x0f\x10\x1f")
{:ok, "\"a日\\t\\\"\\\\\\u0001\\u000F\\u0010\\u001F\""}

iex> Polyjuice.Util.JSON.canonical_json([1,2,3,4])
{:ok, "[1,2,3,4]"}

Unknown or invalid values will cause an error

iex> Polyjuice.Util.JSON.canonical_json([{}])
:error

iex> Polyjuice.Util.JSON.canonical_json([:foo])
:error

iex> Polyjuice.Util.JSON.canonical_json([0x40000000000000])
:error

iex> Polyjuice.Util.JSON.canonical_json([1.1])
:error
Link to this function

sign(val, user, key)

View Source
sign(val :: map(), user :: String.t(), key :: Polyjuice.Util.SigningKey.t()) ::
  {:ok, map()} | :error

Sign a JSON object.

See https://matrix.org/docs/spec/appendices#signing-json for more information about signing JSON.

Examples:

iex> Polyjuice.Util.JSON.sign(
...>   %{},
...>   "domain",
...>   Polyjuice.Util.Ed25519.SigningKey.from_base64("YJDBA9Xnr2sVqXD9Vj7XVUnmFZcZrlw8Md7kMW+3XA1", "1")
...> )
{
  :ok,
  %{
    "signatures" => %{
      "domain" => %{
        "ed25519:1" => "K8280/U9SSy9IVtjBuVeLr+HpOB4BQFWbg+UZaADMtTdGYI7Geitb76LTrr5QV/7Xg4ahLwYGYZzuHGZKM5ZAQ"
      }
    }
  }
}

iex> Polyjuice.Util.JSON.sign(
...>   %{"one" => 1, "two" => "Two"},
...>   "domain",
...>   Polyjuice.Util.Ed25519.SigningKey.from_base64("YJDBA9Xnr2sVqXD9Vj7XVUnmFZcZrlw8Md7kMW+3XA1", "1")
...> )
{
  :ok,
  %{
    "one" => 1,
    "signatures" => %{
      "domain" => %{
        "ed25519:1" => "KqmLSbO39/Bzb0QIYE82zqLwsA+PDzYIpIRA2sRQ4sL53+sN6/fpNSoqE7BP7vBZhG6kYdD13EIMJpvhJI+6Bw"
      }
    },
    "two" => "Two"
  }
}
Link to this function

signed?(val, user, key)

View Source
signed?(val :: map(), user :: String.t(), key :: Polyjuice.Util.VerifyKey.t()) ::
  boolean()

Verify a signed JSON object.

See https://matrix.org/docs/spec/appendices#signing-json for more information about signing JSON.

Examples:

iex> Polyjuice.Util.JSON.signed?(
...>   %{
...>     "signatures" => %{
...>       "domain" => %{
...>         "ed25519:1" => "K8280/U9SSy9IVtjBuVeLr+HpOB4BQFWbg+UZaADMtTdGYI7Geitb76LTrr5QV/7Xg4ahLwYGYZzuHGZKM5ZAQ"
...>       }
...>     }
...>   },
...>   "domain",
...>   Polyjuice.Util.Ed25519.VerifyKey.from_base64("XGX0JRS2Af3be3knz2fBiRbApjm2Dh61gXDJA8kcJNI", "1")
...> )
true

iex> Polyjuice.Util.JSON.signed?(
...>   %{
...>     "one" => 1,
...>     "signatures" => %{
...>       "domain" => %{
...>         "ed25519:1" => "KqmLSbO39/Bzb0QIYE82zqLwsA+PDzYIpIRA2sRQ4sL53+sN6/fpNSoqE7BP7vBZhG6kYdD13EIMJpvhJI+6Bw"
...>       }
...>     },
...>     "two" => "Two"
...>   },
...>   "domain",
...>   Polyjuice.Util.Ed25519.VerifyKey.from_base64("XGX0JRS2Af3be3knz2fBiRbApjm2Dh61gXDJA8kcJNI", "1")
...> )
true

Missing signature:

iex> Polyjuice.Util.JSON.signed?(
...>   %{
...>     "signatures" => %{
...>       "domain" => %{
...>         "ed25519:2" => "K8280/U9SSy9IVtjBuVeLr+HpOB4BQFWbg+UZaADMtTdGYI7Geitb76LTrr5QV/7Xg4ahLwYGYZzuHGZKM5ZAQ"
...>       }
...>     }
...>   },
...>   "domain",
...>   Polyjuice.Util.Ed25519.VerifyKey.from_base64("XGX0JRS2Af3be3knz2fBiRbApjm2Dh61gXDJA8kcJNI", "1")
...> )
false

Incorrect signature:

iex> Polyjuice.Util.JSON.signed?(
...>   %{
...>     "signatures" => %{
...>       "domain" => %{
...>         "ed25519:1" => "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
...>       }
...>     }
...>   },
...>   "domain",
...>   Polyjuice.Util.Ed25519.VerifyKey.from_base64("XGX0JRS2Af3be3knz2fBiRbApjm2Dh61gXDJA8kcJNI", "1")
...> )
false
This function is deprecated. use `Polyjuice.Util.JSON.signed?/3` instead.