Skip to content

Commit c67784c

Browse files
committed
carrot+fcmp: fix subaddress openings in KI devices and SAL code
1 parent 83f576b commit c67784c

File tree

6 files changed

+38
-22
lines changed

6 files changed

+38
-22
lines changed

src/carrot_impl/key_image_device_composed.cpp

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -106,16 +106,19 @@ crypto::key_image key_image_device_composed::derive_key_image(const OutputOpenin
106106
case AddressDeriveType::Carrot:
107107
// K_s
108108
main_address_spend_pubkey = m_addr_dev.access_carrot_hierarchy_device().get_carrot_account_spend_pubkey();
109-
// L_partial *= k^j_subscal
110-
m_addr_dev.access_carrot_hierarchy_device().make_index_extension_generator(subaddr_index.index.major,
111-
subaddr_index.index.minor,
112-
carrot_address_index_extension_generator);
113-
make_carrot_subaddress_scalar(main_address_spend_pubkey,
114-
carrot_address_index_extension_generator,
115-
subaddr_index.index.major,
116-
subaddr_index.index.minor,
117-
carrot_subaddr_scalar);
118-
partial_key_image = rct::scalarmultKey(partial_key_image, rct::sk2rct(carrot_subaddr_scalar));
109+
if (subaddr_index.index.is_subaddress())
110+
{
111+
// L_partial *= k^j_subscal
112+
m_addr_dev.access_carrot_hierarchy_device().make_index_extension_generator(subaddr_index.index.major,
113+
subaddr_index.index.minor,
114+
carrot_address_index_extension_generator);
115+
make_carrot_subaddress_scalar(main_address_spend_pubkey,
116+
carrot_address_index_extension_generator,
117+
subaddr_index.index.major,
118+
subaddr_index.index.minor,
119+
carrot_subaddr_scalar);
120+
partial_key_image = rct::scalarmultKey(partial_key_image, rct::sk2rct(carrot_subaddr_scalar));
121+
}
119122
break;
120123
default:
121124
throw make_local_device_error{-2}("unrecognized address derive type");

src/carrot_impl/tx_builder_inputs.cpp

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -232,11 +232,18 @@ void make_sal_proof_any_to_carrot_v1(const crypto::hash &signable_tx_hash,
232232

233233
// k^j_subscal = H_n(K_s, j_major, j_minor, s^j_gen)
234234
crypto::secret_key subaddress_scalar;
235-
carrot::make_carrot_subaddress_scalar(main_address_spend_pubkey,
236-
address_index_extension_generator,
237-
subaddr_index.index.major,
238-
subaddr_index.index.minor,
239-
subaddress_scalar);
235+
if (subaddr_index.index.is_subaddress())
236+
{
237+
carrot::make_carrot_subaddress_scalar(main_address_spend_pubkey,
238+
address_index_extension_generator,
239+
subaddr_index.index.major,
240+
subaddr_index.index.minor,
241+
subaddress_scalar);
242+
}
243+
else // main address
244+
{
245+
sc_1(to_bytes(subaddress_scalar));
246+
}
240247

241248
// k^j_g = k_gi * k^j_subscal
242249
crypto::secret_key address_privkey_g;

tests/core_tests/fcmp_pp.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ bool gen_fcmp_pp_tx_validation_base::generate_with(std::vector<test_event_entry>
155155
CHECK_AND_ASSERT_MES(r, false, "Failed to generate key image");
156156

157157
// Source
158-
const tools::wallet2::transfer_details wallet2_td{
158+
const wallet2_basic::transfer_details wallet2_td{
159159
.m_block_height = 0,
160160
.m_tx = blocks[0].miner_tx,
161161
.m_txid = blocks[0].hash,

tests/unit_tests/carrot_fcmp.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -374,7 +374,7 @@ TEST(carrot_fcmp, receive_scan_spend_and_verify_serialized_carrot_tx)
374374
// derive input key images
375375
std::vector<crypto::key_image> sorted_input_key_images;
376376
carrot::get_sorted_input_key_images_from_proposal_v1(tx_proposal,
377-
alice.key_image_dev,
377+
alice.carrot_key_image_dev,
378378
sorted_input_key_images);
379379

380380
// derive output enote set

tests/unit_tests/carrot_mock_helpers.h

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -79,11 +79,13 @@ struct mock_carrot_and_legacy_keys
7979
view_incoming_key_ram_borrowed_device k_view_incoming_dev;
8080
view_balance_secret_ram_borrowed_device s_view_balance_dev;
8181
generate_image_key_ram_borrowed_device k_generate_image_dev;
82+
generate_image_key_ram_borrowed_device k_spend_generate_image_dev;
8283
generate_address_secret_ram_borrowed_device s_generate_address_dev;
8384
cryptonote_hierarchy_address_device_ram_borrowed cn_addr_dev;
8485
carrot_hierarchy_address_device_ram_borrowed carrot_addr_dev;
8586
hybrid_hierarchy_address_device_composed hybrid_addr_dev;
86-
key_image_device_composed key_image_dev;
87+
key_image_device_composed legacy_key_image_dev;
88+
key_image_device_composed carrot_key_image_dev;
8789

8890
std::unordered_map<crypto::public_key, subaddress_index_extended> subaddress_map;
8991

@@ -93,22 +95,26 @@ struct mock_carrot_and_legacy_keys
9395
k_view_incoming_dev(legacy_acb.get_keys().m_view_secret_key),
9496
s_view_balance_dev(s_view_balance),
9597
k_generate_image_dev(k_generate_image),
98+
k_spend_generate_image_dev(legacy_acb.get_keys().m_spend_secret_key),
9699
s_generate_address_dev(s_generate_address),
97100
cn_addr_dev(legacy_acb.get_keys().m_account_address.m_spend_public_key, legacy_acb.get_keys().m_view_secret_key),
98101
carrot_addr_dev(carrot_account_spend_pubkey, carrot_account_view_pubkey, legacy_acb.get_keys().m_account_address.m_view_public_key, s_generate_address),
99102
hybrid_addr_dev(&cn_addr_dev, &carrot_addr_dev),
100-
key_image_dev(k_generate_image_dev, hybrid_addr_dev, &s_view_balance_dev, &k_view_incoming_dev)
103+
legacy_key_image_dev(k_spend_generate_image_dev, hybrid_addr_dev, nullptr, &k_view_incoming_dev),
104+
carrot_key_image_dev(k_generate_image_dev, hybrid_addr_dev, &s_view_balance_dev, &k_view_incoming_dev)
101105
{}
102106

103107
mock_carrot_and_legacy_keys(const mock_carrot_and_legacy_keys &k):
104108
k_view_incoming_dev(legacy_acb.get_keys().m_view_secret_key),
105109
s_view_balance_dev(s_view_balance),
106110
k_generate_image_dev(k_generate_image),
111+
k_spend_generate_image_dev(legacy_acb.get_keys().m_spend_secret_key),
107112
s_generate_address_dev(s_generate_address),
108113
cn_addr_dev(legacy_acb.get_keys().m_account_address.m_spend_public_key, legacy_acb.get_keys().m_view_secret_key),
109114
carrot_addr_dev(carrot_account_spend_pubkey, carrot_account_view_pubkey, legacy_acb.get_keys().m_account_address.m_view_public_key, s_generate_address),
110115
hybrid_addr_dev(&cn_addr_dev, &carrot_addr_dev),
111-
key_image_dev(k_generate_image_dev, hybrid_addr_dev, &s_view_balance_dev, &k_view_incoming_dev)
116+
legacy_key_image_dev(k_spend_generate_image_dev, hybrid_addr_dev, nullptr, &k_view_incoming_dev),
117+
carrot_key_image_dev(k_generate_image_dev, hybrid_addr_dev, &s_view_balance_dev, &k_view_incoming_dev)
112118
{
113119
*this = k;
114120
}

tests/unit_tests/carrot_tx_builder.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ TEST(carrot_tx_builder, make_sal_proof_legacy_to_legacy_v1_mainaddr)
8181
.local_output_index = local_output_index
8282
};
8383

84-
const crypto::key_image expected_key_image = keys.key_image_dev.derive_key_image(opening_hint);
84+
const crypto::key_image expected_key_image = keys.legacy_key_image_dev.derive_key_image(opening_hint);
8585

8686
// fake output amount blinding factor in a hypothetical tx where we spent the aforementioned output
8787
const rct::key output_amount_blinding_factor = rct::skGen();
@@ -168,7 +168,7 @@ TEST(carrot_tx_builder, make_sal_proof_legacy_to_legacy_v1_subaddr)
168168
.local_output_index = local_output_index
169169
};
170170

171-
const crypto::key_image expected_key_image = keys.key_image_dev.derive_key_image(opening_hint);
171+
const crypto::key_image expected_key_image = keys.legacy_key_image_dev.derive_key_image(opening_hint);
172172

173173
// fake output amount blinding factor in a hypothetical tx where we spent the aforementioned output
174174
const rct::key output_amount_blinding_factor = rct::skGen();

0 commit comments

Comments
 (0)