aboutsummaryrefslogtreecommitdiff
path: root/src/device
diff options
context:
space:
mode:
Diffstat (limited to 'src/device')
-rw-r--r--src/device/device.hpp4
-rw-r--r--src/device/device_default.cpp8
-rw-r--r--src/device/device_default.hpp4
-rw-r--r--src/device/device_io.hpp2
-rw-r--r--src/device/device_io_hid.cpp8
-rw-r--r--src/device/device_io_hid.hpp2
-rw-r--r--src/device/device_ledger.cpp49
-rw-r--r--src/device/device_ledger.hpp6
8 files changed, 58 insertions, 25 deletions
diff --git a/src/device/device.hpp b/src/device/device.hpp
index 399648f01..bdb608907 100644
--- a/src/device/device.hpp
+++ b/src/device/device.hpp
@@ -208,8 +208,8 @@ namespace hw {
return encrypt_payment_id(payment_id, public_key, secret_key);
}
- virtual bool ecdhEncode(rct::ecdhTuple & unmasked, const rct::key & sharedSec) = 0;
- virtual bool ecdhDecode(rct::ecdhTuple & masked, const rct::key & sharedSec) = 0;
+ virtual bool ecdhEncode(rct::ecdhTuple & unmasked, const rct::key & sharedSec, bool short_amount) = 0;
+ virtual bool ecdhDecode(rct::ecdhTuple & masked, const rct::key & sharedSec, bool short_amount) = 0;
virtual bool add_output_key_mapping(const crypto::public_key &Aout, const crypto::public_key &Bout, const bool is_subaddress, const size_t real_output_index,
const rct::key &amount_key, const crypto::public_key &out_eph_public_key) = 0;
diff --git a/src/device/device_default.cpp b/src/device/device_default.cpp
index 2286998a4..cb2f4e266 100644
--- a/src/device/device_default.cpp
+++ b/src/device/device_default.cpp
@@ -302,13 +302,13 @@ namespace hw {
return true;
}
- bool device_default::ecdhEncode(rct::ecdhTuple & unmasked, const rct::key & sharedSec) {
- rct::ecdhEncode(unmasked, sharedSec);
+ bool device_default::ecdhEncode(rct::ecdhTuple & unmasked, const rct::key & sharedSec, bool short_amount) {
+ rct::ecdhEncode(unmasked, sharedSec, short_amount);
return true;
}
- bool device_default::ecdhDecode(rct::ecdhTuple & masked, const rct::key & sharedSec) {
- rct::ecdhDecode(masked, sharedSec);
+ bool device_default::ecdhDecode(rct::ecdhTuple & masked, const rct::key & sharedSec, bool short_amount) {
+ rct::ecdhDecode(masked, sharedSec, short_amount);
return true;
}
diff --git a/src/device/device_default.hpp b/src/device/device_default.hpp
index 5c59a9066..54d159b11 100644
--- a/src/device/device_default.hpp
+++ b/src/device/device_default.hpp
@@ -111,8 +111,8 @@ namespace hw {
bool encrypt_payment_id(crypto::hash8 &payment_id, const crypto::public_key &public_key, const crypto::secret_key &secret_key) override;
- bool ecdhEncode(rct::ecdhTuple & unmasked, const rct::key & sharedSec) override;
- bool ecdhDecode(rct::ecdhTuple & masked, const rct::key & sharedSec) override;
+ bool ecdhEncode(rct::ecdhTuple & unmasked, const rct::key & sharedSec, bool short_amount) override;
+ bool ecdhDecode(rct::ecdhTuple & masked, const rct::key & sharedSec, bool short_amount) override;
bool add_output_key_mapping(const crypto::public_key &Aout, const crypto::public_key &Bout, const bool is_subaddress, const size_t real_output_index,
const rct::key &amount_key, const crypto::public_key &out_eph_public_key) override;
diff --git a/src/device/device_io.hpp b/src/device/device_io.hpp
index 96163a211..1d5e3564c 100644
--- a/src/device/device_io.hpp
+++ b/src/device/device_io.hpp
@@ -50,7 +50,7 @@ namespace hw {
virtual void disconnect() = 0;
virtual bool connected() const = 0;
- virtual int exchange(unsigned char *command, unsigned int cmd_len, unsigned char *response, unsigned int max_resp_len) = 0;
+ virtual int exchange(unsigned char *command, unsigned int cmd_len, unsigned char *response, unsigned int max_resp_len, bool user_input) = 0;
};
};
};
diff --git a/src/device/device_io_hid.cpp b/src/device/device_io_hid.cpp
index 1aadfb9ea..36c7a241b 100644
--- a/src/device/device_io_hid.cpp
+++ b/src/device/device_io_hid.cpp
@@ -148,7 +148,7 @@ namespace hw {
return this->usb_device != NULL;
}
- int device_io_hid::exchange(unsigned char *command, unsigned int cmd_len, unsigned char *response, unsigned int max_resp_len) {
+ int device_io_hid::exchange(unsigned char *command, unsigned int cmd_len, unsigned char *response, unsigned int max_resp_len, bool user_input) {
unsigned char buffer[400];
unsigned char padding_buffer[MAX_BLOCK+1];
unsigned int result;
@@ -177,7 +177,11 @@ namespace hw {
//get first response
memset(buffer, 0, sizeof(buffer));
- hid_ret = hid_read_timeout(this->usb_device, buffer, MAX_BLOCK, this->timeout);
+ if (!user_input) {
+ hid_ret = hid_read_timeout(this->usb_device, buffer, MAX_BLOCK, this->timeout);
+ } else {
+ hid_ret = hid_read(this->usb_device, buffer, MAX_BLOCK);
+ }
ASSERT_X(hid_ret>=0, "Unable to read hidapi response. Error "+std::to_string(result)+": "+ safe_hid_error(this->usb_device));
result = (unsigned int)hid_ret;
io_hid_log(1, buffer, result);
diff --git a/src/device/device_io_hid.hpp b/src/device/device_io_hid.hpp
index bb0f0a814..c47eefad2 100644
--- a/src/device/device_io_hid.hpp
+++ b/src/device/device_io_hid.hpp
@@ -100,7 +100,7 @@ namespace hw {
void connect(void *params);
void connect(unsigned int vid, unsigned int pid, boost::optional<int> interface_number, boost::optional<unsigned short> usage_page);
bool connected() const;
- int exchange(unsigned char *command, unsigned int cmd_len, unsigned char *response, unsigned int max_resp_len);
+ int exchange(unsigned char *command, unsigned int cmd_len, unsigned char *response, unsigned int max_resp_len, bool user_input);
void disconnect();
void release();
};
diff --git a/src/device/device_ledger.cpp b/src/device/device_ledger.cpp
index bfb41bbe4..9daf62d37 100644
--- a/src/device/device_ledger.cpp
+++ b/src/device/device_ledger.cpp
@@ -176,7 +176,7 @@ namespace hw {
#define INS_GET_RESPONSE 0xc0
- device_ledger::device_ledger(): hw_device(0x0101, 0x05, 64, 120000) {
+ device_ledger::device_ledger(): hw_device(0x0101, 0x05, 64, 2000) {
this->id = device_id++;
this->reset_buffer();
this->mode = NONE;
@@ -235,6 +235,9 @@ namespace hw {
/* IO */
/* ======================================================================= */
+ #define IO_SW_DENY 0x6982
+ #define IO_SECRET_KEY 0x02
+
void device_ledger::logCMD() {
if (apdu_verbose) {
char strbuffer[1024];
@@ -283,7 +286,12 @@ namespace hw {
void device_ledger::send_simple(unsigned char ins, unsigned char p1) {
this->length_send = set_command_header_noopt(ins, p1);
- this->exchange();
+ if (ins == INS_GET_KEY && p1 == IO_SECRET_KEY) {
+ // export view key user input
+ this->exchange_wait_on_input();
+ } else {
+ this->exchange();
+ }
}
bool device_ledger::reset() {
@@ -294,7 +302,7 @@ namespace hw {
unsigned int device_ledger::exchange(unsigned int ok, unsigned int mask) {
logCMD();
- this->length_recv = hw_device.exchange(this->buffer_send, this->length_send, this->buffer_recv, BUFFER_SEND_SIZE);
+ this->length_recv = hw_device.exchange(this->buffer_send, this->length_send, this->buffer_recv, BUFFER_SEND_SIZE, false);
ASSERT_X(this->length_recv>=2, "Communication error, less than tow bytes received");
this->length_recv -= 2;
@@ -305,6 +313,25 @@ namespace hw {
return this->sw;
}
+ unsigned int device_ledger::exchange_wait_on_input(unsigned int ok, unsigned int mask) {
+ logCMD();
+ unsigned int deny = 0;
+ this->length_recv = hw_device.exchange(this->buffer_send, this->length_send, this->buffer_recv, BUFFER_SEND_SIZE, true);
+ ASSERT_X(this->length_recv>=2, "Communication error, less than two bytes received");
+
+ this->length_recv -= 2;
+ this->sw = (this->buffer_recv[length_recv]<<8) | this->buffer_recv[length_recv+1];
+ if (this->sw == IO_SW_DENY) {
+ // cancel on device
+ deny = 1;
+ } else {
+ ASSERT_SW(this->sw,ok,msk);
+ }
+
+ logRESP();
+ return deny;
+ }
+
void device_ledger::reset_buffer() {
this->length_send = 0;
memset(this->buffer_send, 0, BUFFER_SEND_SIZE);
@@ -322,7 +349,7 @@ namespace hw {
}
const std::string device_ledger::get_name() const {
- if (this->full_name.empty() || !this->connected()) {
+ if (!this->connected()) {
return std::string("<disconnected:").append(this->name).append(">");
}
return this->name;
@@ -1140,13 +1167,13 @@ namespace hw {
return true;
}
- bool device_ledger::ecdhEncode(rct::ecdhTuple & unmasked, const rct::key & AKout) {
+ bool device_ledger::ecdhEncode(rct::ecdhTuple & unmasked, const rct::key & AKout, bool short_amount) {
AUTO_LOCK_CMD();
#ifdef DEBUG_HWDEVICE
const rct::key AKout_x = hw::ledger::decrypt(AKout);
rct::ecdhTuple unmasked_x = unmasked;
- this->controle_device->ecdhEncode(unmasked_x, AKout_x);
+ this->controle_device->ecdhEncode(unmasked_x, AKout_x, short_amount);
#endif
int offset = set_command_header_noopt(INS_BLIND);
@@ -1177,13 +1204,13 @@ namespace hw {
return true;
}
- bool device_ledger::ecdhDecode(rct::ecdhTuple & masked, const rct::key & AKout) {
+ bool device_ledger::ecdhDecode(rct::ecdhTuple & masked, const rct::key & AKout, bool short_amount) {
AUTO_LOCK_CMD();
#ifdef DEBUG_HWDEVICE
const rct::key AKout_x = hw::ledger::decrypt(AKout);
rct::ecdhTuple masked_x = masked;
- this->controle_device->ecdhDecode(masked_x, AKout_x);
+ this->controle_device->ecdhDecode(masked_x, AKout_x, short_amount);
#endif
int offset = set_command_header_noopt(INS_UNBLIND);
@@ -1260,7 +1287,8 @@ namespace hw {
this->buffer_send[4] = offset-5;
this->length_send = offset;
- this->exchange();
+ // check fee user input
+ CHECK_AND_ASSERT_THROW_MES(this->exchange_wait_on_input() == 0, "Fee denied on device.");
//pseudoOuts
if (type == rct::RCTTypeSimple) {
@@ -1328,7 +1356,8 @@ namespace hw {
this->buffer_send[4] = offset-5;
this->length_send = offset;
- this->exchange();
+ // check transaction user input
+ CHECK_AND_ASSERT_THROW_MES(this->exchange_wait_on_input() == 0, "Transaction denied on device.");
#ifdef DEBUG_HWDEVICE
hw::ledger::log_hexbuffer("Prehash AKV input", (char*)&this->buffer_recv[64], 3*32);
#endif
diff --git a/src/device/device_ledger.hpp b/src/device/device_ledger.hpp
index 2f5beb044..584f1e096 100644
--- a/src/device/device_ledger.hpp
+++ b/src/device/device_ledger.hpp
@@ -85,7 +85,6 @@ namespace hw {
//IO
hw::io::device_io_hid hw_device;
- std::string full_name;
unsigned int length_send;
unsigned char buffer_send[BUFFER_SEND_SIZE];
unsigned int length_recv;
@@ -95,6 +94,7 @@ namespace hw {
void logCMD(void);
void logRESP(void);
unsigned int exchange(unsigned int ok=0x9000, unsigned int mask=0xFFFF);
+ unsigned int exchange_wait_on_input(unsigned int ok=0x9000, unsigned int mask=0xFFFF);
void reset_buffer(void);
int set_command_header(unsigned char ins, unsigned char p1 = 0x00, unsigned char p2 = 0x00);
int set_command_header_noopt(unsigned char ins, unsigned char p1 = 0x00, unsigned char p2 = 0x00);
@@ -191,8 +191,8 @@ namespace hw {
bool encrypt_payment_id(crypto::hash8 &payment_id, const crypto::public_key &public_key, const crypto::secret_key &secret_key) override;
- bool ecdhEncode(rct::ecdhTuple & unmasked, const rct::key & sharedSec) override;
- bool ecdhDecode(rct::ecdhTuple & masked, const rct::key & sharedSec) override;
+ bool ecdhEncode(rct::ecdhTuple & unmasked, const rct::key & sharedSec, bool short_format) override;
+ bool ecdhDecode(rct::ecdhTuple & masked, const rct::key & sharedSec, bool short_format) override;
bool add_output_key_mapping(const crypto::public_key &Aout, const crypto::public_key &Bout, const bool is_subaddress, const size_t real_output_index,
const rct::key &amount_key, const crypto::public_key &out_eph_public_key) override;