Module: Bitcoin::MessageSign

Defined in:
lib/bitcoin/message_sign.rb

Defined Under Namespace

Classes: Error

Class Method Summary collapse

Class Method Details

.message_hash(message, prefix: Bitcoin.chain_params.message_magic) ⇒ Object

Hashes a message for signing and verification.



35
36
37
# File 'lib/bitcoin/message_sign.rb', line 35

def message_hash(message, prefix: Bitcoin.chain_params.message_magic)
  Bitcoin.double_sha256(Bitcoin.pack_var_string(prefix) << Bitcoin.pack_var_string(message))
end

.sign_message(key, message, prefix: Bitcoin.chain_params.message_magic) ⇒ String

Sign a message.

Parameters:

  • key (Bitcoin::Key)

    Private key to sign with.

  • message (String)

    The message to sign.

Returns:

  • (String)

    Signature, base64 encoded.



13
14
15
16
17
# File 'lib/bitcoin/message_sign.rb', line 13

def sign_message(key, message, prefix: Bitcoin.chain_params.message_magic)
  digest = message_hash(message, prefix: prefix)
  compact_sig = key.sign_compact(digest)
  Base64.strict_encode64(compact_sig)
end

.verify_message(address, signature, message, prefix: Bitcoin.chain_params.message_magic) ⇒ Boolean

Verify a signed message.

Parameters:

  • address (String)

    Signer’s bitcoin address, it must refer to a public key.

  • signature (String)

    The signature in base64 format.

  • message (String)

    The message that was signed.

Returns:

  • (Boolean)

    Verification result.

Raises:

  • (ArgumentError)


24
25
26
27
28
29
30
31
32
# File 'lib/bitcoin/message_sign.rb', line 24

def verify_message(address, signature, message, prefix: Bitcoin.chain_params.message_magic)
  validate_address!(address)
  sig = Base64.decode64(signature)
  raise ArgumentError, 'Invalid signature length' unless sig.bytesize == Bitcoin::Key::COMPACT_SIGNATURE_SIZE
  digest = message_hash(message, prefix: prefix)
  pubkey = Bitcoin::Key.recover_compact(digest, sig)
  return false unless pubkey
  pubkey.to_p2pkh == address
end