2020-05-07 02:36:54 +00:00
// Copyright (c) 2014-2020, The Monero Project
2014-07-23 13:03:52 +00:00
//
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without modification, are
// permitted provided that the following conditions are met:
//
// 1. Redistributions of source code must retain the above copyright notice, this list of
// conditions and the following disclaimer.
//
// 2. Redistributions in binary form must reproduce the above copyright notice, this list
// of conditions and the following disclaimer in the documentation and/or other
// materials provided with the distribution.
//
// 3. Neither the name of the copyright holder nor the names of its contributors may be
// used to endorse or promote products derived from this software without specific
// prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
// Parts of this file are originally copyright (c) 2012-2013 The Cryptonote developers
2014-03-03 22:07:58 +00:00
# pragma once
2017-01-26 15:07:23 +00:00
# include "cryptonote_basic.h"
2014-03-03 22:07:58 +00:00
# include "crypto/crypto.h"
# include "serialization/keyvalue_serialization.h"
namespace cryptonote
{
struct account_keys
{
account_public_address m_account_address ;
crypto : : secret_key m_spend_secret_key ;
crypto : : secret_key m_view_secret_key ;
2017-08-13 14:29:31 +00:00
std : : vector < crypto : : secret_key > m_multisig_keys ;
2018-02-20 16:01:27 +00:00
hw : : device * m_device = & hw : : get_device ( " default " ) ;
2018-07-08 20:12:33 +00:00
crypto : : chacha_iv m_encryption_iv ;
2014-03-03 22:07:58 +00:00
BEGIN_KV_SERIALIZE_MAP ( )
KV_SERIALIZE ( m_account_address )
KV_SERIALIZE_VAL_POD_AS_BLOB_FORCE ( m_spend_secret_key )
KV_SERIALIZE_VAL_POD_AS_BLOB_FORCE ( m_view_secret_key )
2017-08-13 14:29:31 +00:00
KV_SERIALIZE_CONTAINER_POD_AS_BLOB ( m_multisig_keys )
2018-07-08 20:12:33 +00:00
const crypto : : chacha_iv default_iv { { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 } } ;
KV_SERIALIZE_VAL_POD_AS_BLOB_OPT ( m_encryption_iv , default_iv )
2014-03-03 22:07:58 +00:00
END_KV_SERIALIZE_MAP ( )
2018-02-20 16:01:27 +00:00
account_keys & operator = ( account_keys const & ) = default ;
2020-08-09 23:11:54 +00:00
void encrypt_wrapper ( const crypto : : chacha_key & key , const bool all_keys ) ;
void decrypt_wrapper ( const crypto : : chacha_key & key , const bool all_keys ) ;
void decrypt_legacy ( const crypto : : chacha_key & key ) ;
2018-07-08 20:12:33 +00:00
2018-02-20 16:01:27 +00:00
hw : : device & get_device ( ) const ;
void set_device ( hw : : device & hwdev ) ;
2018-07-08 20:12:33 +00:00
private :
2020-08-09 23:11:54 +00:00
void chacha_wrapper ( const crypto : : chacha_key & key , const bool all_keys ) ;
2014-03-03 22:07:58 +00:00
} ;
/************************************************************************/
/* */
/************************************************************************/
class account_base
{
public :
account_base ( ) ;
2014-06-09 00:04:32 +00:00
crypto : : secret_key generate ( const crypto : : secret_key & recovery_key = crypto : : secret_key ( ) , bool recover = false , bool two_random = false ) ;
2018-08-23 22:50:31 +00:00
void create_from_device ( const std : : string & device_name ) ;
void create_from_device ( hw : : device & hwdev ) ;
2016-02-22 22:10:55 +00:00
void create_from_keys ( const cryptonote : : account_public_address & address , const crypto : : secret_key & spendkey , const crypto : : secret_key & viewkey ) ;
2015-06-20 11:31:02 +00:00
void create_from_viewkey ( const cryptonote : : account_public_address & address , const crypto : : secret_key & viewkey ) ;
2017-08-13 14:29:31 +00:00
bool make_multisig ( const crypto : : secret_key & view_secret_key , const crypto : : secret_key & spend_secret_key , const crypto : : public_key & spend_public_key , const std : : vector < crypto : : secret_key > & multisig_keys ) ;
void finalize_multisig ( const crypto : : public_key & spend_public_key ) ;
2014-03-03 22:07:58 +00:00
const account_keys & get_keys ( ) const ;
2018-02-16 11:04:04 +00:00
std : : string get_public_address_str ( network_type nettype ) const ;
std : : string get_public_integrated_address_str ( const crypto : : hash8 & payment_id , network_type nettype ) const ;
2014-03-03 22:07:58 +00:00
2018-02-20 16:01:27 +00:00
hw : : device & get_device ( ) const { return m_keys . get_device ( ) ; }
void set_device ( hw : : device & hwdev ) { m_keys . set_device ( hwdev ) ; }
2018-08-23 21:50:53 +00:00
void deinit ( ) ;
2018-02-20 16:01:27 +00:00
2014-03-03 22:07:58 +00:00
uint64_t get_createtime ( ) const { return m_creation_timestamp ; }
void set_createtime ( uint64_t val ) { m_creation_timestamp = val ; }
bool load ( const std : : string & file_path ) ;
bool store ( const std : : string & file_path ) ;
2015-05-31 14:32:54 +00:00
void forget_spend_key ( ) ;
2017-08-13 14:29:31 +00:00
const std : : vector < crypto : : secret_key > & get_multisig_keys ( ) const { return m_keys . m_multisig_keys ; }
2015-05-31 14:32:54 +00:00
2020-08-09 23:11:54 +00:00
void encrypt_keys ( const crypto : : chacha_key & key ) { m_keys . encrypt_wrapper ( key , true ) ; }
void encrypt_keys_same_iv ( const crypto : : chacha_key & key ) { m_keys . decrypt_wrapper ( key , true ) ; } // encryption with the same IV is the same as decryption due to symmetry
void decrypt_keys ( const crypto : : chacha_key & key ) { m_keys . decrypt_wrapper ( key , true ) ; }
void encrypt_viewkey ( const crypto : : chacha_key & key ) { m_keys . encrypt_wrapper ( key , false ) ; }
void decrypt_viewkey ( const crypto : : chacha_key & key ) { m_keys . decrypt_wrapper ( key , false ) ; }
void decrypt_legacy ( const crypto : : chacha_key & key ) { m_keys . decrypt_legacy ( key ) ; }
2018-07-08 20:12:33 +00:00
2014-03-03 22:07:58 +00:00
template < class t_archive >
inline void serialize ( t_archive & a , const unsigned int /*ver*/ )
{
a & m_keys ;
a & m_creation_timestamp ;
}
BEGIN_KV_SERIALIZE_MAP ( )
KV_SERIALIZE ( m_keys )
KV_SERIALIZE ( m_creation_timestamp )
END_KV_SERIALIZE_MAP ( )
private :
void set_null ( ) ;
account_keys m_keys ;
uint64_t m_creation_timestamp ;
} ;
}