aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorcslashm <cslashm@gmail.com>2020-04-03 22:56:55 +0200
committercslashm <cslashm@gmail.com>2020-04-08 11:12:32 +0200
commit688a3e87e712123d182ae6715610c461988f9e74 (patch)
tree8c1a262441b36a20d665a9f3c5076182be6c5308 /src
parentMerge pull request #6336 (diff)
downloadmonero-688a3e87e712123d182ae6715610c461988f9e74.tar.xz
Add timelock verification on device
Diffstat (limited to 'src')
-rw-r--r--src/cryptonote_basic/cryptonote_format_utils.cpp14
-rw-r--r--src/cryptonote_basic/cryptonote_format_utils.h2
-rw-r--r--src/cryptonote_core/cryptonote_tx_utils.cpp2
-rw-r--r--src/device/device.hpp3
-rw-r--r--src/device/device_default.cpp4
-rw-r--r--src/device/device_default.hpp1
-rw-r--r--src/device/device_ledger.cpp78
-rw-r--r--src/device/device_ledger.hpp2
8 files changed, 104 insertions, 2 deletions
diff --git a/src/cryptonote_basic/cryptonote_format_utils.cpp b/src/cryptonote_basic/cryptonote_format_utils.cpp
index 651d61b06..f0b395f43 100644
--- a/src/cryptonote_basic/cryptonote_format_utils.cpp
+++ b/src/cryptonote_basic/cryptonote_format_utils.cpp
@@ -128,6 +128,20 @@ namespace cryptonote
namespace cryptonote
{
//---------------------------------------------------------------
+ void get_transaction_prefix_hash(const transaction_prefix& tx, crypto::hash& h, hw::device &hwdev)
+ {
+ hwdev.get_transaction_prefix_hash(tx,h);
+ }
+
+ //---------------------------------------------------------------
+ crypto::hash get_transaction_prefix_hash(const transaction_prefix& tx, hw::device &hwdev)
+ {
+ crypto::hash h = null_hash;
+ get_transaction_prefix_hash(tx, h, hwdev);
+ return h;
+ }
+
+ //---------------------------------------------------------------
void get_transaction_prefix_hash(const transaction_prefix& tx, crypto::hash& h)
{
std::ostringstream s;
diff --git a/src/cryptonote_basic/cryptonote_format_utils.h b/src/cryptonote_basic/cryptonote_format_utils.h
index 8ed3b0b43..d1b24d950 100644
--- a/src/cryptonote_basic/cryptonote_format_utils.h
+++ b/src/cryptonote_basic/cryptonote_format_utils.h
@@ -48,6 +48,8 @@ namespace epee
namespace cryptonote
{
//---------------------------------------------------------------
+ void get_transaction_prefix_hash(const transaction_prefix& tx, crypto::hash& h, hw::device &hwdev);
+ crypto::hash get_transaction_prefix_hash(const transaction_prefix& tx, hw::device &hwdev);
void get_transaction_prefix_hash(const transaction_prefix& tx, crypto::hash& h);
crypto::hash get_transaction_prefix_hash(const transaction_prefix& tx);
bool parse_and_validate_tx_prefix_from_blob(const blobdata& tx_blob, transaction_prefix& tx);
diff --git a/src/cryptonote_core/cryptonote_tx_utils.cpp b/src/cryptonote_core/cryptonote_tx_utils.cpp
index f50fc61a5..eb16fb297 100644
--- a/src/cryptonote_core/cryptonote_tx_utils.cpp
+++ b/src/cryptonote_core/cryptonote_tx_utils.cpp
@@ -590,7 +590,7 @@ namespace cryptonote
tx.vout[i].amount = 0;
crypto::hash tx_prefix_hash;
- get_transaction_prefix_hash(tx, tx_prefix_hash);
+ get_transaction_prefix_hash(tx, tx_prefix_hash, hwdev);
rct::ctkeyV outSk;
if (use_simple_rct)
tx.rct_signatures = rct::genRctSimple(rct::hash2rct(tx_prefix_hash), inSk, destinations, inamounts, outamounts, amount_in - amount_out, mixRing, amount_keys, msout ? &kLRki : NULL, msout, index, outSk, rct_config, hwdev);
diff --git a/src/device/device.hpp b/src/device/device.hpp
index 215e97eb6..3d9ea0449 100644
--- a/src/device/device.hpp
+++ b/src/device/device.hpp
@@ -56,6 +56,7 @@ namespace cryptonote
struct subaddress_index;
struct tx_destination_entry;
struct keypair;
+ class transaction_prefix;
}
namespace hw {
@@ -203,6 +204,8 @@ namespace hw {
virtual bool open_tx(crypto::secret_key &tx_key) = 0;
+ virtual void get_transaction_prefix_hash(const cryptonote::transaction_prefix& tx, crypto::hash& h) = 0;
+
virtual bool encrypt_payment_id(crypto::hash8 &payment_id, const crypto::public_key &public_key, const crypto::secret_key &secret_key) = 0;
bool decrypt_payment_id(crypto::hash8 &payment_id, const crypto::public_key &public_key, const crypto::secret_key &secret_key)
{
diff --git a/src/device/device_default.cpp b/src/device/device_default.cpp
index dc06ce237..619cd4f30 100644
--- a/src/device/device_default.cpp
+++ b/src/device/device_default.cpp
@@ -284,6 +284,10 @@ namespace hw {
return true;
}
+ void device_default::get_transaction_prefix_hash(const cryptonote::transaction_prefix& tx, crypto::hash& h) {
+ cryptonote::get_transaction_prefix_hash(tx, h);
+ }
+
bool device_default::generate_output_ephemeral_keys(const size_t tx_version,
const cryptonote::account_keys &sender_account_keys, const crypto::public_key &txkey_pub, const crypto::secret_key &tx_key,
const cryptonote::tx_destination_entry &dst_entr, const boost::optional<cryptonote::account_public_address> &change_addr, const size_t output_index,
diff --git a/src/device/device_default.hpp b/src/device/device_default.hpp
index 5252d4129..64cad78b0 100644
--- a/src/device/device_default.hpp
+++ b/src/device/device_default.hpp
@@ -112,6 +112,7 @@ namespace hw {
crypto::signature &sig) override;
bool open_tx(crypto::secret_key &tx_key) override;
+ void get_transaction_prefix_hash(const cryptonote::transaction_prefix& tx, crypto::hash& h) override;
bool encrypt_payment_id(crypto::hash8 &payment_id, const crypto::public_key &public_key, const crypto::secret_key &secret_key) override;
diff --git a/src/device/device_ledger.cpp b/src/device/device_ledger.cpp
index 49f54e5a5..4213609c1 100644
--- a/src/device/device_ledger.cpp
+++ b/src/device/device_ledger.cpp
@@ -191,7 +191,7 @@ namespace hw {
static int device_id = 0;
- #define PROTOCOL_VERSION 2
+ #define PROTOCOL_VERSION 3
#define INS_NONE 0x00
#define INS_RESET 0x02
@@ -228,6 +228,7 @@ namespace hw {
#define INS_BLIND 0x78
#define INS_UNBLIND 0x7A
#define INS_GEN_TXOUT_KEYS 0x7B
+ #define INS_PREFIX_HASH 0x7D
#define INS_VALIDATE 0x7C
#define INS_MLSAG 0x7E
#define INS_CLOSE_TX 0x80
@@ -1346,6 +1347,81 @@ namespace hw {
return true;
}
+ void device_ledger::get_transaction_prefix_hash(const cryptonote::transaction_prefix& tx, crypto::hash& h) {
+ AUTO_LOCK_CMD();
+
+ int pref_length = 0, pref_offset = 0, offset = 0;
+
+ #ifdef DEBUG_HWDEVICE
+ crypto::hash h_x;
+ this->controle_device->get_transaction_prefix_hash(tx,h_x);
+ MDEBUG("get_transaction_prefix_hash [[IN]] h_x/1 "<<h_x);
+ #endif
+
+ std::ostringstream s_x;
+ binary_archive<true> a_x(s_x);
+ CHECK_AND_ASSERT_THROW_MES(::serialization::serialize(a_x, const_cast<cryptonote::transaction_prefix&>(tx)),
+ "unable to serialize transaction prefix");
+ pref_length = s_x.str().size();
+ //auto pref = std::make_unique<unsigned char[]>(pref_length);
+ auto uprt_pref = std::unique_ptr<unsigned char[]>{ new unsigned char[pref_length] };
+ unsigned char* pref = uprt_pref.get();
+ memmove(pref, s_x.str().data(), pref_length);
+
+ offset = set_command_header_noopt(INS_PREFIX_HASH,1);
+ pref_offset = 0;
+ unsigned char v;
+
+ //version as varint
+ do {
+ v = pref[pref_offset];
+ this->buffer_send[offset] = v;
+ offset += 1;
+ pref_offset += 1;
+ } while (v&0x80);
+
+ //locktime as var int
+ do {
+ v = pref[pref_offset];
+ this->buffer_send[offset] = v;
+ offset += 1;
+ pref_offset += 1;
+ } while (v&0x80);
+
+ this->buffer_send[4] = offset-5;
+ this->length_send = offset;
+ this->exchange_wait_on_input();
+
+ //hash remains
+ int cnt = 0;
+ while (pref_offset < pref_length) {
+ int len;
+ cnt++;
+ offset = set_command_header(INS_PREFIX_HASH,2,cnt);
+ len = pref_length - pref_offset;
+ //options
+ if (len > (BUFFER_SEND_SIZE-7)) {
+ len = BUFFER_SEND_SIZE-7;
+ this->buffer_send[offset] = 0x80;
+ } else {
+ this->buffer_send[offset] = 0x00;
+ }
+ offset += 1;
+ //send chunk
+ memmove(&this->buffer_send[offset], pref+pref_offset, len);
+ offset += len;
+ pref_offset += len;
+ this->buffer_send[4] = offset-5;
+ this->length_send = offset;
+ this->exchange();
+ }
+ memmove(h.data, &this->buffer_recv[0], 32);
+
+ #ifdef DEBUG_HWDEVICE
+ hw::ledger::check8("prefix_hash", "h", h_x.data, h.data);
+ #endif
+ }
+
bool device_ledger::encrypt_payment_id(crypto::hash8 &payment_id, const crypto::public_key &public_key, const crypto::secret_key &secret_key) {
AUTO_LOCK_CMD();
diff --git a/src/device/device_ledger.hpp b/src/device/device_ledger.hpp
index 05a26143a..5cd233632 100644
--- a/src/device/device_ledger.hpp
+++ b/src/device/device_ledger.hpp
@@ -235,6 +235,8 @@ namespace hw {
bool open_tx(crypto::secret_key &tx_key) override;
+ void get_transaction_prefix_hash(const cryptonote::transaction_prefix& tx, crypto::hash& h) override;
+
bool encrypt_payment_id(crypto::hash8 &payment_id, const crypto::public_key &public_key, const crypto::secret_key &secret_key) override;
rct::key genCommitmentMask(const rct::key &amount_key) override;