2017-06-07 21:32:45 +02:00
#!/usr/bin/env python3
2020-12-31 09:48:25 +01:00
# Copyright (c) 2016-2020 The Bitcoin Core developers
2017-06-07 21:32:45 +02:00
# Distributed under the MIT software license, see the accompanying
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
""" Test Wallet encryption """
import time
2017-08-16 17:52:24 +02:00
from test_framework . test_framework import BitcoinTestFramework
2017-06-07 21:32:45 +02:00
from test_framework . util import (
2017-07-12 16:33:46 +02:00
assert_raises_rpc_error ,
2018-01-06 08:08:57 +01:00
assert_greater_than ,
assert_greater_than_or_equal ,
2017-06-07 21:32:45 +02:00
)
2020-07-02 02:02:05 +02:00
2017-06-07 21:32:45 +02:00
class WalletEncryptionTest ( BitcoinTestFramework ) :
2017-06-10 00:21:21 +02:00
def set_test_params ( self ) :
2017-06-07 21:32:45 +02:00
self . setup_clean_chain = True
self . num_nodes = 1
2018-09-09 19:32:37 +02:00
def skip_test_if_missing_module ( self ) :
self . skip_if_no_wallet ( )
2017-06-07 21:32:45 +02:00
def run_test ( self ) :
passphrase = " WalletPassphrase "
passphrase2 = " SecondWalletPassphrase "
# Make sure the wallet isn't encrypted first
2019-07-22 20:47:17 +02:00
msg = " test message "
address = self . nodes [ 0 ] . getnewaddress ( address_type = ' legacy ' )
sig = self . nodes [ 0 ] . signmessage ( address , msg )
assert self . nodes [ 0 ] . verifymessage ( address , sig , msg )
2018-11-26 22:19:06 +01:00
assert_raises_rpc_error ( - 15 , " Error: running with an unencrypted wallet, but walletpassphrase was called " , self . nodes [ 0 ] . walletpassphrase , ' ff ' , 1 )
assert_raises_rpc_error ( - 15 , " Error: running with an unencrypted wallet, but walletpassphrasechange was called. " , self . nodes [ 0 ] . walletpassphrasechange , ' ff ' , ' ff ' )
2017-06-07 21:32:45 +02:00
# Encrypt the wallet
2018-11-26 22:19:06 +01:00
assert_raises_rpc_error ( - 8 , " passphrase can not be empty " , self . nodes [ 0 ] . encryptwallet , ' ' )
2018-02-20 22:09:51 +01:00
self . nodes [ 0 ] . encryptwallet ( passphrase )
2017-06-07 21:32:45 +02:00
# Test that the wallet is encrypted
2019-07-22 20:47:17 +02:00
assert_raises_rpc_error ( - 13 , " Please enter the wallet passphrase with walletpassphrase first " , self . nodes [ 0 ] . signmessage , address , msg )
2018-11-26 22:19:06 +01:00
assert_raises_rpc_error ( - 15 , " Error: running with an encrypted wallet, but encryptwallet was called. " , self . nodes [ 0 ] . encryptwallet , ' ff ' )
assert_raises_rpc_error ( - 8 , " passphrase can not be empty " , self . nodes [ 0 ] . walletpassphrase , ' ' , 1 )
assert_raises_rpc_error ( - 8 , " passphrase can not be empty " , self . nodes [ 0 ] . walletpassphrasechange , ' ' , ' ff ' )
2017-06-07 21:32:45 +02:00
# Check that walletpassphrase works
self . nodes [ 0 ] . walletpassphrase ( passphrase , 2 )
2019-07-22 20:47:17 +02:00
sig = self . nodes [ 0 ] . signmessage ( address , msg )
assert self . nodes [ 0 ] . verifymessage ( address , sig , msg )
2017-06-07 21:32:45 +02:00
# Check that the timeout is right
2019-07-18 22:12:51 +02:00
time . sleep ( 3 )
2019-07-22 20:47:17 +02:00
assert_raises_rpc_error ( - 13 , " Please enter the wallet passphrase with walletpassphrase first " , self . nodes [ 0 ] . signmessage , address , msg )
2017-06-07 21:32:45 +02:00
# Test wrong passphrase
2017-07-12 16:33:46 +02:00
assert_raises_rpc_error ( - 14 , " wallet passphrase entered was incorrect " , self . nodes [ 0 ] . walletpassphrase , passphrase + " wrong " , 10 )
2017-06-07 21:32:45 +02:00
# Test walletlock
self . nodes [ 0 ] . walletpassphrase ( passphrase , 84600 )
2019-07-22 20:47:17 +02:00
sig = self . nodes [ 0 ] . signmessage ( address , msg )
assert self . nodes [ 0 ] . verifymessage ( address , sig , msg )
2017-06-07 21:32:45 +02:00
self . nodes [ 0 ] . walletlock ( )
2019-07-22 20:47:17 +02:00
assert_raises_rpc_error ( - 13 , " Please enter the wallet passphrase with walletpassphrase first " , self . nodes [ 0 ] . signmessage , address , msg )
2017-06-07 21:32:45 +02:00
# Test passphrase changes
self . nodes [ 0 ] . walletpassphrasechange ( passphrase , passphrase2 )
2017-07-12 16:33:46 +02:00
assert_raises_rpc_error ( - 14 , " wallet passphrase entered was incorrect " , self . nodes [ 0 ] . walletpassphrase , passphrase , 10 )
2017-06-07 21:32:45 +02:00
self . nodes [ 0 ] . walletpassphrase ( passphrase2 , 10 )
2019-07-22 20:47:17 +02:00
sig = self . nodes [ 0 ] . signmessage ( address , msg )
assert self . nodes [ 0 ] . verifymessage ( address , sig , msg )
2018-01-06 08:08:57 +01:00
self . nodes [ 0 ] . walletlock ( )
# Test timeout bounds
assert_raises_rpc_error ( - 8 , " Timeout cannot be negative. " , self . nodes [ 0 ] . walletpassphrase , passphrase2 , - 10 )
2020-07-02 02:02:05 +02:00
self . log . info ( ' Check a timeout less than the limit ' )
2018-04-06 17:54:52 +02:00
MAX_VALUE = 100000000
expected_time = int ( time . time ( ) ) + MAX_VALUE - 600
self . nodes [ 0 ] . walletpassphrase ( passphrase2 , MAX_VALUE - 600 )
2020-12-24 14:37:17 +01:00
# give buffer for walletpassphrase, since it iterates over all encrypted keys
2020-07-02 02:02:05 +02:00
expected_time_with_buffer = time . time ( ) + MAX_VALUE - 600
2018-01-06 08:08:57 +01:00
actual_time = self . nodes [ 0 ] . getwalletinfo ( ) [ ' unlocked_until ' ]
assert_greater_than_or_equal ( actual_time , expected_time )
2020-07-02 02:02:05 +02:00
assert_greater_than ( expected_time_with_buffer , actual_time )
self . log . info ( ' Check a timeout greater than the limit ' )
2018-04-06 17:54:52 +02:00
expected_time = int ( time . time ( ) ) + MAX_VALUE - 1
self . nodes [ 0 ] . walletpassphrase ( passphrase2 , MAX_VALUE + 1000 )
2020-07-02 02:02:05 +02:00
expected_time_with_buffer = time . time ( ) + MAX_VALUE
2018-01-06 08:08:57 +01:00
actual_time = self . nodes [ 0 ] . getwalletinfo ( ) [ ' unlocked_until ' ]
assert_greater_than_or_equal ( actual_time , expected_time )
2020-07-02 02:02:05 +02:00
assert_greater_than ( expected_time_with_buffer , actual_time )
2017-06-07 21:32:45 +02:00
if __name__ == ' __main__ ' :
WalletEncryptionTest ( ) . main ( )