libcrypto.messages

Chain-specific message signing and verification built on the signing engine.

Ethereum (EIP-191 personal_sign)

hash_ethereum_message(message) -> bytes

Return the EIP-191 Keccak-256 digest of a personal message. The message is prefixed with "\x19Ethereum Signed Message:\n" + len(message).

sign_message_ethereum(private_key, message) -> bytes

Return a 65-byte signature r (32) || s (32) || v (1), where v = 27 + recovery_id.

recover_address_ethereum(message, signature) -> str

Recover the EIP-55 checksummed signer address.

verify_message_ethereum(address, message, signature) -> bool

Verify a signature against an expected address (case-insensitive). Returns False for any malformed input.

from libcrypto import (
    sign_message_ethereum, recover_address_ethereum, verify_message_ethereum,
)

key = 1
sig = sign_message_ethereum(key, "Hello, world!")
addr = recover_address_ethereum("Hello, world!", sig)
assert verify_message_ethereum(addr, "Hello, world!", sig)

Bitcoin signed messages

hash_bitcoin_message(message) -> bytes

Return the double-SHA256 digest using the "\x18Bitcoin Signed Message:\n" magic and a CompactSize length prefix.

sign_message_bitcoin(private_key, message, *, compressed=True) -> str

Return the Base64 header || r || s signature. The header byte is 27 + recovery_id (+4 for compressed public keys), matching Bitcoin Core's signmessage.

recover_address_bitcoin(message, signature, *, network="bitcoin") -> str

Recover the P2PKH signer address (compression is taken from the header byte).

verify_message_bitcoin(address, message, signature, *, network="bitcoin") -> bool

Verify against an expected P2PKH address. Returns False for malformed input.

from libcrypto import (
    sign_message_bitcoin, recover_address_bitcoin, verify_message_bitcoin,
)

key = 1
sig = sign_message_bitcoin(key, "Hello, world!", compressed=True)
addr = recover_address_bitcoin("Hello, world!", sig)
assert verify_message_bitcoin(addr, "Hello, world!", sig)

Notes

  • Signatures are deterministic (RFC 6979), so the same key and message always produce the same signature.
  • message may be str (UTF-8 encoded) or bytes.