2020-06-27 13:24:04 +02:00
|
|
|
#include "shared_context.h"
|
|
|
|
|
#include "apdu_constants.h"
|
|
|
|
|
#include "feature_signTx.h"
|
2021-11-22 14:39:36 +01:00
|
|
|
#include "eth_plugin_interface.h"
|
2020-06-27 13:24:04 +02:00
|
|
|
|
2020-12-01 16:20:13 +01:00
|
|
|
void handleSign(uint8_t p1,
|
|
|
|
|
uint8_t p2,
|
2022-07-15 12:33:19 +02:00
|
|
|
const uint8_t *workBuffer,
|
2022-07-19 11:42:25 +02:00
|
|
|
uint8_t dataLength,
|
2020-12-01 16:20:13 +01:00
|
|
|
unsigned int *flags,
|
|
|
|
|
unsigned int *tx) {
|
|
|
|
|
UNUSED(tx);
|
|
|
|
|
parserStatus_e txResult;
|
2021-12-17 12:04:51 +01:00
|
|
|
|
|
|
|
|
if (os_global_pin_is_validated() != BOLOS_UX_OK) {
|
|
|
|
|
PRINTF("Device is PIN-locked");
|
|
|
|
|
THROW(0x6982);
|
|
|
|
|
}
|
2020-12-01 16:20:13 +01:00
|
|
|
if (p1 == P1_FIRST) {
|
|
|
|
|
if (appState != APP_STATE_IDLE) {
|
|
|
|
|
reset_app_context();
|
|
|
|
|
}
|
|
|
|
|
appState = APP_STATE_SIGNING_TX;
|
2022-07-08 11:12:50 +02:00
|
|
|
|
|
|
|
|
workBuffer = parseBip32(workBuffer, &dataLength, &tmpCtx.transactionContext.bip32);
|
|
|
|
|
|
|
|
|
|
if (workBuffer == NULL) {
|
2020-12-01 16:20:13 +01:00
|
|
|
THROW(0x6a80);
|
|
|
|
|
}
|
2022-07-08 11:12:50 +02:00
|
|
|
|
2021-06-11 11:37:16 +02:00
|
|
|
tmpContent.txContent.dataPresent = false;
|
2021-04-23 19:15:30 +02:00
|
|
|
dataContext.tokenContext.pluginStatus = ETH_PLUGIN_RESULT_UNAVAILABLE;
|
2021-04-15 17:59:41 +02:00
|
|
|
|
2021-07-31 14:21:10 +02:00
|
|
|
initTx(&txContext, &global_sha3, &tmpContent.txContent, customProcessor, NULL);
|
|
|
|
|
|
2022-07-08 11:12:50 +02:00
|
|
|
if (dataLength < 1) {
|
|
|
|
|
PRINTF("Invalid data\n");
|
|
|
|
|
THROW(0x6a80);
|
|
|
|
|
}
|
|
|
|
|
|
2021-04-15 17:59:41 +02:00
|
|
|
// EIP 2718: TransactionType might be present before the TransactionPayload.
|
|
|
|
|
uint8_t txType = *workBuffer;
|
|
|
|
|
if (txType >= MIN_TX_TYPE && txType <= MAX_TX_TYPE) {
|
|
|
|
|
// Enumerate through all supported txTypes here...
|
2021-06-10 17:17:47 +02:00
|
|
|
if (txType == EIP2930 || txType == EIP1559) {
|
2024-03-18 08:58:05 +01:00
|
|
|
CX_ASSERT(cx_hash_no_throw((cx_hash_t *) &global_sha3, 0, workBuffer, 1, NULL, 0));
|
2021-04-15 17:59:41 +02:00
|
|
|
txContext.txType = txType;
|
|
|
|
|
workBuffer++;
|
|
|
|
|
dataLength--;
|
|
|
|
|
} else {
|
2021-11-22 14:39:36 +01:00
|
|
|
PRINTF("Transaction type %d not supported\n", txType);
|
2021-04-15 17:59:41 +02:00
|
|
|
THROW(0x6501);
|
|
|
|
|
}
|
2021-04-21 16:56:17 +02:00
|
|
|
} else {
|
|
|
|
|
txContext.txType = LEGACY;
|
2021-04-15 17:59:41 +02:00
|
|
|
}
|
2021-08-27 14:47:59 +02:00
|
|
|
PRINTF("TxType: %x\n", txContext.txType);
|
2020-12-01 16:20:13 +01:00
|
|
|
} else if (p1 != P1_MORE) {
|
|
|
|
|
THROW(0x6B00);
|
2020-10-07 16:56:40 +02:00
|
|
|
}
|
2020-12-01 16:20:13 +01:00
|
|
|
if (p2 != 0) {
|
|
|
|
|
THROW(0x6B00);
|
2020-06-27 13:24:04 +02:00
|
|
|
}
|
2020-12-01 16:20:13 +01:00
|
|
|
if ((p1 == P1_MORE) && (appState != APP_STATE_SIGNING_TX)) {
|
|
|
|
|
PRINTF("Signature not initialized\n");
|
|
|
|
|
THROW(0x6985);
|
2020-06-27 13:24:04 +02:00
|
|
|
}
|
2021-04-21 16:56:17 +02:00
|
|
|
if (txContext.currentField == RLP_NONE) {
|
2020-12-01 16:20:13 +01:00
|
|
|
PRINTF("Parser not initialized\n");
|
|
|
|
|
THROW(0x6985);
|
|
|
|
|
}
|
2024-07-26 10:46:52 +02:00
|
|
|
txResult = processTx(&txContext, workBuffer, dataLength);
|
2020-12-01 16:20:13 +01:00
|
|
|
switch (txResult) {
|
|
|
|
|
case USTREAM_SUSPENDED:
|
|
|
|
|
break;
|
|
|
|
|
case USTREAM_FINISHED:
|
|
|
|
|
break;
|
|
|
|
|
case USTREAM_PROCESSING:
|
|
|
|
|
THROW(0x9000);
|
|
|
|
|
case USTREAM_FAULT:
|
|
|
|
|
THROW(0x6A80);
|
|
|
|
|
default:
|
|
|
|
|
PRINTF("Unexpected parser status\n");
|
|
|
|
|
THROW(0x6A80);
|
2020-06-27 13:24:04 +02:00
|
|
|
}
|
|
|
|
|
|
2020-12-01 16:20:13 +01:00
|
|
|
if (txResult == USTREAM_FINISHED) {
|
2024-06-21 11:49:42 +02:00
|
|
|
finalizeParsing();
|
2020-12-01 16:20:13 +01:00
|
|
|
}
|
2020-07-07 23:54:18 +02:00
|
|
|
|
2020-12-01 16:20:13 +01:00
|
|
|
*flags |= IO_ASYNCH_REPLY;
|
2020-06-27 13:24:04 +02:00
|
|
|
}
|