Skip to content
Permalink
Browse files

device_ledger: include status code name in error message

  • Loading branch information
xiphon committed Feb 7, 2020
1 parent 51873fe commit abf96adcb1956f6cc86f5a8e7d77d710aa6c4b95
Showing with 134 additions and 3 deletions.
  1. +81 −1 src/device/device_ledger.cpp
  2. +53 −2 src/device/device_ledger.hpp
@@ -27,6 +27,8 @@
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//

#include <map>

#include "version.h"
#include "device_ledger.hpp"
#include "ringct/rctOps.h"
@@ -55,7 +57,10 @@ namespace hw {
}

#define TRACKD MTRACE("hw")
#define ASSERT_SW(sw,ok,msk) CHECK_AND_ASSERT_THROW_MES(((sw)&(mask))==(ok), "Wrong Device Status : SW=" << std::hex << (sw) << " (EXPECT=" << std::hex << (ok) << ", MASK=" << std::hex << (mask) << ")") ;
#define ASSERT_SW(sw,ok,msk) CHECK_AND_ASSERT_THROW_MES(((sw)&(mask))==(ok), \
"Wrong Device Status: " << "0x" << std::hex << (sw) << " (" << Status(sw).to_string() << "), " << \
"EXPECTED 0x" << std::hex << (ok) << " (" << Status(ok).to_string() << "), " << \
"MASK 0x" << std::hex << (mask));
#define ASSERT_T0(exp) CHECK_AND_ASSERT_THROW_MES(exp, "Protocol assert failure: "#exp ) ;
#define ASSERT_X(exp,msg) CHECK_AND_ASSERT_THROW_MES(exp, msg);

@@ -64,6 +69,81 @@ namespace hw {
crypto::secret_key dbg_spendkey;
#endif

#define LEDGER_STATUS(status) {status, #status}
static const std::map<unsigned int, const char *> status_codes = {
LEDGER_STATUS(SW_OK),
LEDGER_STATUS(SW_ALGORITHM_UNSUPPORTED),

LEDGER_STATUS(SW_BYTES_REMAINING_00),

LEDGER_STATUS(SW_WARNING_STATE_UNCHANGED),
LEDGER_STATUS(SW_STATE_TERMINATED),

LEDGER_STATUS(SW_MORE_DATA_AVAILABLE),

LEDGER_STATUS(SW_WRONG_LENGTH),

LEDGER_STATUS(SW_LOGICAL_CHANNEL_NOT_SUPPORTED),
LEDGER_STATUS(SW_SECURE_MESSAGING_NOT_SUPPORTED),
LEDGER_STATUS(SW_LAST_COMMAND_EXPECTED),
LEDGER_STATUS(SW_COMMAND_CHAINING_NOT_SUPPORTED),

LEDGER_STATUS(SW_SECURITY_LOAD_KEY),
LEDGER_STATUS(SW_SECURITY_COMMITMENT_CONTROL),
LEDGER_STATUS(SW_SECURITY_AMOUNT_CHAIN_CONTROL),
LEDGER_STATUS(SW_SECURITY_COMMITMENT_CHAIN_CONTROL),
LEDGER_STATUS(SW_SECURITY_OUTKEYS_CHAIN_CONTROL),
LEDGER_STATUS(SW_SECURITY_MAXOUTPUT_REACHED),
LEDGER_STATUS(SW_SECURITY_TRUSTED_INPUT),

LEDGER_STATUS(SW_CLIENT_NOT_SUPPORTED),

LEDGER_STATUS(SW_SECURITY_STATUS_NOT_SATISFIED),
LEDGER_STATUS(SW_FILE_INVALID),
LEDGER_STATUS(SW_PIN_BLOCKED),
LEDGER_STATUS(SW_DATA_INVALID),
LEDGER_STATUS(SW_CONDITIONS_NOT_SATISFIED),
LEDGER_STATUS(SW_COMMAND_NOT_ALLOWED),
LEDGER_STATUS(SW_APPLET_SELECT_FAILED),

LEDGER_STATUS(SW_WRONG_DATA),
LEDGER_STATUS(SW_FUNC_NOT_SUPPORTED),
LEDGER_STATUS(SW_FILE_NOT_FOUND),
LEDGER_STATUS(SW_RECORD_NOT_FOUND),
LEDGER_STATUS(SW_FILE_FULL),
LEDGER_STATUS(SW_INCORRECT_P1P2),
LEDGER_STATUS(SW_REFERENCED_DATA_NOT_FOUND),

LEDGER_STATUS(SW_WRONG_P1P2),
LEDGER_STATUS(SW_CORRECT_LENGTH_00),
LEDGER_STATUS(SW_INS_NOT_SUPPORTED),
LEDGER_STATUS(SW_CLA_NOT_SUPPORTED),

LEDGER_STATUS(SW_UNKNOWN)
};

class Status {
public:
Status(unsigned int code)
{
const auto it = status_codes.find(code);
if (it != status_codes.end())
{
string = it->second;
} else {
string = "UNKNOWN";
}
}

const char *to_string() const
{
return string;
}

private:
const char *string;
};

/* ===================================================================== */
/* === hmacmap ==== */
/* ===================================================================== */
@@ -58,6 +58,57 @@ namespace hw {

#ifdef WITH_DEVICE_LEDGER

// Origin: https://github.com/LedgerHQ/ledger-app-monero/blob/master/src/monero_types.h
#define SW_OK 0x9000
#define SW_ALGORITHM_UNSUPPORTED 0x9484

#define SW_BYTES_REMAINING_00 0x6100

#define SW_WARNING_STATE_UNCHANGED 0x6200
#define SW_STATE_TERMINATED 0x6285

#define SW_MORE_DATA_AVAILABLE 0x6310

#define SW_WRONG_LENGTH 0x6700

#define SW_LOGICAL_CHANNEL_NOT_SUPPORTED 0x6881
#define SW_SECURE_MESSAGING_NOT_SUPPORTED 0x6882
#define SW_LAST_COMMAND_EXPECTED 0x6883
#define SW_COMMAND_CHAINING_NOT_SUPPORTED 0x6884

#define SW_SECURITY_LOAD_KEY 0x6900
#define SW_SECURITY_COMMITMENT_CONTROL 0x6911
#define SW_SECURITY_AMOUNT_CHAIN_CONTROL 0x6912
#define SW_SECURITY_COMMITMENT_CHAIN_CONTROL 0x6913
#define SW_SECURITY_OUTKEYS_CHAIN_CONTROL 0x6914
#define SW_SECURITY_MAXOUTPUT_REACHED 0x6915
#define SW_SECURITY_TRUSTED_INPUT 0x6916

#define SW_CLIENT_NOT_SUPPORTED 0x6930

#define SW_SECURITY_STATUS_NOT_SATISFIED 0x6982
#define SW_FILE_INVALID 0x6983
#define SW_PIN_BLOCKED 0x6983
#define SW_DATA_INVALID 0x6984
#define SW_CONDITIONS_NOT_SATISFIED 0x6985
#define SW_COMMAND_NOT_ALLOWED 0x6986
#define SW_APPLET_SELECT_FAILED 0x6999

#define SW_WRONG_DATA 0x6a80
#define SW_FUNC_NOT_SUPPORTED 0x6a81
#define SW_FILE_NOT_FOUND 0x6a82
#define SW_RECORD_NOT_FOUND 0x6a83
#define SW_FILE_FULL 0x6a84
#define SW_INCORRECT_P1P2 0x6a86
#define SW_REFERENCED_DATA_NOT_FOUND 0x6a88

#define SW_WRONG_P1P2 0x6b00
#define SW_CORRECT_LENGTH_00 0x6c00
#define SW_INS_NOT_SUPPORTED 0x6d00
#define SW_CLA_NOT_SUPPORTED 0x6e00

#define SW_UNKNOWN 0x6f00

namespace {
bool apdu_verbose =true;
}
@@ -128,8 +179,8 @@ namespace hw {
unsigned int id;
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);
unsigned int exchange(unsigned int ok=SW_OK, unsigned int mask=0xFFFF);
unsigned int exchange_wait_on_input(unsigned int ok=SW_OK, 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);

0 comments on commit abf96ad

Please sign in to comment.
You can’t perform that action at this time.