diff options
Diffstat (limited to 'src/cryptonote_core/cryptonote_basic_impl.cpp')
-rw-r--r-- | src/cryptonote_core/cryptonote_basic_impl.cpp | 75 |
1 files changed, 71 insertions, 4 deletions
diff --git a/src/cryptonote_core/cryptonote_basic_impl.cpp b/src/cryptonote_core/cryptonote_basic_impl.cpp index f2d862e57..839c6ad1e 100644 --- a/src/cryptonote_core/cryptonote_basic_impl.cpp +++ b/src/cryptonote_core/cryptonote_basic_impl.cpp @@ -44,6 +44,21 @@ using namespace epee; namespace cryptonote { + struct integrated_address { + account_public_address adr; + crypto::hash payment_id; + + BEGIN_SERIALIZE_OBJECT() + FIELD(adr) + FIELD(payment_id) + END_SERIALIZE() + + BEGIN_KV_SERIALIZE_MAP() + KV_SERIALIZE(adr) + KV_SERIALIZE(payment_id) + END_KV_SERIALIZE_MAP() + }; + /************************************************************************/ /* Cryptonote helper functions */ /************************************************************************/ @@ -106,6 +121,16 @@ namespace cryptonote { return summ; } + //------------------------------------------------------------------------------------ + uint8_t get_account_integrated_address_checksum(const public_integrated_address_outer_blob& bl) + { + const unsigned char* pbuf = reinterpret_cast<const unsigned char*>(&bl); + uint8_t summ = 0; + for(size_t i = 0; i!= sizeof(public_integrated_address_outer_blob)-1; i++) + summ += pbuf[i]; + + return summ; + } //----------------------------------------------------------------------- std::string get_account_address_as_str( bool testnet @@ -118,6 +143,21 @@ namespace cryptonote { return tools::base58::encode_addr(address_prefix, t_serializable_object_to_blob(adr)); } //----------------------------------------------------------------------- + std::string get_account_integrated_address_as_str( + bool testnet + , account_public_address const & adr + , crypto::hash const & payment_id + ) + { + uint64_t integrated_address_prefix = testnet ? + config::testnet::CRYPTONOTE_PUBLIC_INTEGRATED_ADDRESS_BASE58_PREFIX : config::CRYPTONOTE_PUBLIC_INTEGRATED_ADDRESS_BASE58_PREFIX; + + integrated_address iadr = { + adr, payment_id + }; + return tools::base58::encode_addr(integrated_address_prefix, t_serializable_object_to_blob(iadr)); + } + //----------------------------------------------------------------------- bool is_coinbase(const transaction& tx) { if(tx.vin.size() != 1) @@ -129,14 +169,18 @@ namespace cryptonote { return true; } //----------------------------------------------------------------------- - bool get_account_address_from_str( + bool get_account_integrated_address_from_str( account_public_address& adr + , bool& has_payment_id + , crypto::hash& payment_id , bool testnet , std::string const & str ) { uint64_t address_prefix = testnet ? config::testnet::CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX : config::CRYPTONOTE_PUBLIC_ADDRESS_BASE58_PREFIX; + uint64_t integrated_address_prefix = testnet ? + config::testnet::CRYPTONOTE_PUBLIC_INTEGRATED_ADDRESS_BASE58_PREFIX : config::CRYPTONOTE_PUBLIC_INTEGRATED_ADDRESS_BASE58_PREFIX; if (2 * sizeof(public_address_outer_blob) != str.size()) { @@ -148,18 +192,29 @@ namespace cryptonote { return false; } - if (address_prefix != prefix) + if (integrated_address_prefix == prefix) + { + has_payment_id = true; + } + else if (address_prefix == prefix) { - LOG_PRINT_L1("Wrong address prefix: " << prefix << ", expected " << address_prefix); + has_payment_id = false; + } + else { + LOG_PRINT_L1("Wrong address prefix: " << prefix << ", expected " << address_prefix << " or " << integrated_address_prefix); return false; } - if (!::serialization::parse_binary(data, adr)) + integrated_address iadr; + if (!::serialization::parse_binary(data, iadr)) { LOG_PRINT_L1("Account public address keys can't be parsed"); return false; } + adr = iadr.adr; + payment_id = iadr.payment_id; + if (!crypto::check_key(adr.m_spend_public_key) || !crypto::check_key(adr.m_view_public_key)) { LOG_PRINT_L1("Failed to validate address keys"); @@ -196,10 +251,22 @@ namespace cryptonote { //we success adr = blob.m_address; + has_payment_id = false; } return true; } + //----------------------------------------------------------------------- + bool get_account_address_from_str( + account_public_address& adr + , bool testnet + , std::string const & str + ) + { + bool has_payment_id; + crypto::hash payment_id; + return get_account_integrated_address_from_str(adr, has_payment_id, payment_id, testnet, str); + } bool operator ==(const cryptonote::transaction& a, const cryptonote::transaction& b) { return cryptonote::get_transaction_hash(a) == cryptonote::get_transaction_hash(b); |