* fix Wanchain app sign error * remove redundant path --------- Co-authored-by: zhwir <zhwir@163.com>
93 lines
2.7 KiB
C
93 lines
2.7 KiB
C
#include "shared_context.h"
|
|
#include "apdu_constants.h"
|
|
#include "feature_signTx.h"
|
|
#include "eth_plugin_interface.h"
|
|
|
|
void handleSign(uint8_t p1,
|
|
uint8_t p2,
|
|
const uint8_t *workBuffer,
|
|
uint8_t dataLength,
|
|
unsigned int *flags,
|
|
unsigned int *tx) {
|
|
UNUSED(tx);
|
|
parserStatus_e txResult;
|
|
|
|
if (os_global_pin_is_validated() != BOLOS_UX_OK) {
|
|
PRINTF("Device is PIN-locked");
|
|
THROW(0x6982);
|
|
}
|
|
if (p1 == P1_FIRST) {
|
|
if (appState != APP_STATE_IDLE) {
|
|
reset_app_context();
|
|
}
|
|
appState = APP_STATE_SIGNING_TX;
|
|
|
|
workBuffer = parseBip32(workBuffer, &dataLength, &tmpCtx.transactionContext.bip32);
|
|
|
|
if (workBuffer == NULL) {
|
|
THROW(0x6a80);
|
|
}
|
|
|
|
tmpContent.txContent.dataPresent = false;
|
|
dataContext.tokenContext.pluginStatus = ETH_PLUGIN_RESULT_UNAVAILABLE;
|
|
|
|
initTx(&txContext, &global_sha3, &tmpContent.txContent, customProcessor, NULL);
|
|
|
|
if (dataLength < 1) {
|
|
PRINTF("Invalid data\n");
|
|
THROW(0x6a80);
|
|
}
|
|
|
|
// 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...
|
|
if (txType == EIP2930 || txType == EIP1559) {
|
|
CX_ASSERT(cx_hash_no_throw((cx_hash_t *) &global_sha3, 0, workBuffer, 1, NULL, 0));
|
|
txContext.txType = txType;
|
|
workBuffer++;
|
|
dataLength--;
|
|
} else {
|
|
PRINTF("Transaction type %d not supported\n", txType);
|
|
THROW(0x6501);
|
|
}
|
|
} else {
|
|
txContext.txType = LEGACY;
|
|
}
|
|
PRINTF("TxType: %x\n", txContext.txType);
|
|
} else if (p1 != P1_MORE) {
|
|
THROW(0x6B00);
|
|
}
|
|
if (p2 != 0) {
|
|
THROW(0x6B00);
|
|
}
|
|
if ((p1 == P1_MORE) && (appState != APP_STATE_SIGNING_TX)) {
|
|
PRINTF("Signature not initialized\n");
|
|
THROW(0x6985);
|
|
}
|
|
if (txContext.currentField == RLP_NONE) {
|
|
PRINTF("Parser not initialized\n");
|
|
THROW(0x6985);
|
|
}
|
|
txResult = processTx(&txContext, workBuffer, dataLength);
|
|
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);
|
|
}
|
|
|
|
if (txResult == USTREAM_FINISHED) {
|
|
finalizeParsing();
|
|
}
|
|
|
|
*flags |= IO_ASYNCH_REPLY;
|
|
}
|