def sign_recoverable(self, message: bytes, hasher: Hasher = sha256, custom_nonce: Nonce = DEFAULT_NONCE) -> bytes: """ Create a recoverable ECDSA signature. :param message: The message to sign. :param hasher: The hash function to use, which must return 32 bytes. By default, the `sha256` algorithm is used. If `None`, no hashing occurs. :param custom_nonce: Custom nonce data in the form `(nonce_function, input_data)`. Refer to [secp256k1_recovery.h](https://github.com/bitcoin-core/secp256k1/blob/f8c0b57e6ba202b1ce7c5357688de97c9c067697/include/secp256k1_recovery.h#L78-L79). :return: The recoverable ECDSA signature. :raises ValueError: If the message hash was not 32 bytes long, the nonce generation function failed, or the private key was invalid. """ msg_hash = hasher(message) if hasher is not None else message if len(msg_hash) != 32: raise ValueError('Message hash must be 32 bytes long.') signature = ffi.new('secp256k1_ecdsa_recoverable_signature *') nonce_fn, nonce_data = custom_nonce signed = lib.secp256k1_ecdsa_sign_recoverable(self.context.ctx, signature, msg_hash, self.secret, nonce_fn, nonce_data) if not signed: raise ValueError( 'The nonce generation function failed, or the private key was invalid.' ) return serialize_recoverable(signature, self.context)
def sign_recoverable(self, message, hasher=sha256): msg_hash = hasher(message) if hasher is not None else message if len(msg_hash) != 32: raise ValueError('Message hash must be 32 bytes long.') signature = ffi.new('secp256k1_ecdsa_recoverable_signature *') signed = lib.secp256k1_ecdsa_sign_recoverable( self.context.ctx, signature, msg_hash, self.secret, ffi.NULL, ffi.NULL ) if not signed: raise ValueError('The nonce generation function failed, or the private key was invalid.') return serialize_recoverable(signature, self.context)