Monero
out_can_be_to_acc.h
Go to the documentation of this file.
1 // Copyright (c) 2014-2022, The Monero Project
2 //
3 // All rights reserved.
4 //
5 // Redistribution and use in source and binary forms, with or without modification, are
6 // permitted provided that the following conditions are met:
7 //
8 // 1. Redistributions of source code must retain the above copyright notice, this list of
9 // conditions and the following disclaimer.
10 //
11 // 2. Redistributions in binary form must reproduce the above copyright notice, this list
12 // of conditions and the following disclaimer in the documentation and/or other
13 // materials provided with the distribution.
14 //
15 // 3. Neither the name of the copyright holder nor the names of its contributors may be
16 // used to endorse or promote products derived from this software without specific
17 // prior written permission.
18 //
19 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
20 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
21 // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
22 // THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
24 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25 // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
26 // STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
27 // THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 //
29 // Parts of this file are originally copyright (c) 2012-2013 The Cryptonote developers
30 
31 #pragma once
32 
33 #include "crypto/crypto.h"
35 
36 #include "single_tx_test_base.h"
37 
38 using namespace crypto;
39 
40 // use_view_tags: whether to enable view tag checking
41 // is_owned: whether the output is owned by us
42 template<bool use_view_tags, bool is_owned>
44 {
45  public:
46  static const size_t loop_count = 1000;
47 
48  bool init()
49  {
51  return false;
52 
55 
56  m_output_index = 0;
57  m_view_secret_key = m_bob.get_keys().m_view_secret_key;
58  m_spend_public_key = m_bob.get_keys().m_account_address.m_spend_public_key;
59 
60  cryptonote::get_output_public_key(m_tx.vout[m_output_index], m_output_public_key);
61 
62  if (use_view_tags)
63  {
64  crypto::generate_key_derivation(m_tx_pub_key, m_view_secret_key, key_derivation);
65  crypto::derive_view_tag(key_derivation, m_output_index, vt);
66  m_view_tag_opt = vt;
67  }
68  else
69  m_view_tag_opt = boost::optional<crypto::view_tag>();
70 
71  return true;
72  }
73 
74  bool test()
75  {
76  // include key derivation to demonstrate performance improvement when using view tags
78  crypto::generate_key_derivation(m_tx_pub_key, m_view_secret_key, key_derivation);
79 
80  // if using view tags, this ensures we computed the view tag properly
81  if (!cryptonote::out_can_be_to_acc(m_view_tag_opt, key_derivation, m_output_index))
82  return false;
83 
84  // if user owns output, this tests the output public key matches the derived
85  if (is_owned)
86  {
87  crypto::public_key output_public_key;
88  crypto::derive_public_key(key_derivation, m_output_index, m_spend_public_key, output_public_key);
89 
90  if (m_output_public_key != output_public_key)
91  return false;
92  }
93 
94  return true;
95  }
96 
97  private:
102  boost::optional<crypto::view_tag> m_view_tag_opt;
103 };
bool out_can_be_to_acc(const boost::optional< crypto::view_tag > &view_tag_opt, const crypto::key_derivation &derivation, const size_t output_index, hw::device *hwdev)
Definition: cryptonote_format_utils.cpp:1006
POD_CLASS key_derivation
Definition: crypto.h:88
crypto namespace.
Definition: crypto.cpp:60
bool get_output_public_key(const cryptonote::tx_out &out, crypto::public_key &output_public_key)
Definition: cryptonote_format_utils.cpp:923
POD_CLASS view_tag
Definition: crypto.h:103
boost::optional< crypto::view_tag > m_view_tag_opt
Definition: out_can_be_to_acc.h:102
bool generate_key_derivation(const public_key &key1, const secret_key &key2, key_derivation &derivation)
Definition: crypto.h:232
bool test()
Definition: out_can_be_to_acc.h:74
void derive_view_tag(const key_derivation &derivation, std::size_t output_index, view_tag &vt)
Definition: crypto.h:312
bool init()
Definition: out_can_be_to_acc.h:48
Definition: single_tx_test_base.h:37
POD_CLASS public_key
Definition: crypto.h:61
crypto::public_key m_output_public_key
Definition: out_can_be_to_acc.h:101
bool derive_public_key(const key_derivation &derivation, std::size_t output_index, const public_key &base, public_key &derived_key)
Definition: crypto.h:235
crypto::public_key m_spend_public_key
Definition: out_can_be_to_acc.h:100
Definition: out_can_be_to_acc.h:43
size_t m_output_index
Definition: out_can_be_to_acc.h:98
bool init()
Definition: single_tx_test_base.h:40
crypto::secret_key m_view_secret_key
Definition: out_can_be_to_acc.h:99