Packages
stellar_sdk
0.9.0
0.23.0
0.22.0
0.21.2
0.21.1
0.21.0
0.20.0
0.19.0
0.18.1
0.18.0
0.17.1
0.17.0
0.16.1
0.16.0
0.15.1
0.15.0
0.14.0
0.13.1
0.13.0
0.12.0
0.11.8
0.11.7
0.11.6
0.11.5
0.11.4
0.11.3
0.11.2
0.11.1
0.11.0
0.10.2
0.10.1
0.10.0
0.9.3
0.9.2
0.9.1
0.9.0
0.8.1
0.8.0
0.7.1
0.7.0
0.6.0
0.5.0
0.4.0
0.3.0
0.2.0
0.1.0
Elixir SDK for the Stellar network.
Current section
Files
Jump to
Current section
Files
lib/tx_build/signature.ex
defmodule Stellar.TxBuild.Signature do
@moduledoc """
`Signature` struct definition.
"""
alias Stellar.KeyPair
alias StellarBase.XDR.{
DecoratedSignature,
Signature,
SignatureHint,
PublicKey,
PublicKeyType,
UInt256
}
@behaviour Stellar.TxBuild.XDR
@type t :: %__MODULE__{
public_key: String.t(),
secret: String.t(),
raw_public_key: binary(),
raw_secret: binary(),
hint: binary()
}
defstruct [:public_key, :secret, :raw_public_key, :raw_secret, :hint]
@impl true
def new(keypair, opts \\ [])
def new({public_key, secret}, _opts) do
with :ok <- KeyPair.validate_public_key(public_key),
:ok <- KeyPair.validate_secret_seed(secret),
do: build_signature(public_key, secret)
end
@spec to_xdr(signature :: t(), base_signature :: binary()) :: DecoratedSignature.t()
def to_xdr(%__MODULE__{hint: hint, secret: secret}, base_signature) do
base_signature
|> KeyPair.sign(secret)
|> decorated_signature(hint)
end
@impl true
def to_xdr(%__MODULE__{hint: hint, raw_secret: raw_secret}),
do: decorated_signature(raw_secret, hint)
@spec decorated_signature(raw_signature :: binary(), hint :: binary()) :: DecoratedSignature.t()
defp decorated_signature(raw_signature, hint) do
signature = Signature.new(raw_signature)
hint
|> SignatureHint.new()
|> DecoratedSignature.new(signature)
end
@spec build_signature(public_key :: String.t(), secret :: String.t()) :: t()
defp build_signature(public_key, secret) do
raw_public_key = KeyPair.raw_public_key(public_key)
raw_secret = KeyPair.raw_secret_seed(secret)
signature_hint = signature_hint(raw_public_key)
%__MODULE__{
public_key: public_key,
raw_public_key: raw_public_key,
secret: secret,
raw_secret: raw_secret,
hint: signature_hint
}
end
@spec signature_hint(raw_public_key :: binary()) :: binary()
defp signature_hint(raw_public_key) do
key_type = PublicKeyType.new(:PUBLIC_KEY_TYPE_ED25519)
raw_public_key
|> UInt256.new()
|> PublicKey.new(key_type)
|> PublicKey.encode_xdr!()
|> public_key_hint()
end
@spec public_key_hint(encoded_public_key :: binary()) :: binary()
defp public_key_hint(encoded_public_key) do
bytes_size = byte_size(encoded_public_key)
binary_part(encoded_public_key, bytes_size - 4, 4)
end
end