lib/utils/crypto.ex

defmodule ArweaveSdkEx.Utils.Crypto do

  def sign(msg, jwk_json) do
    #  JOSE.JWK.from_binary(File.read!(file_path))
    priv =
      jwk_json
      |> get_jwk_from_json()
      |> jwk_to_priv()
    do_sign(msg, priv)
  end

  def get_jwk_from_json(jwk_json) do
    jwk_json
    |> Poison.encode!()
    |> JOSE.JWK.from_binary()
  end

  def jwk_to_priv(jwk) do
    %JOSE.JWK{kty: {_, priv}} = jwk
    priv
  end

  def do_sign(msg, priv) do
    :public_key.sign(
      msg,
      :sha256,
      priv,
      [rsa_padding: :rsa_pkcs1_pss_padding, rsa_pss_saltlen: -1]
    )
  end

  def sha384(data), do: :crypto.hash(:sha384, data)
  def sha256(data), do: :crypto.hash(:sha256, data)

  def url_encode64(data), do: Base.url_encode64(data, padding: false)
  def url_decode64(data), do: Base.url_decode64!(data, padding: false)

end