Skip to content

Commit

Permalink
Fix with datum option
Browse files Browse the repository at this point in the history
  • Loading branch information
rustamlabs authored and janmazak committed Aug 10, 2022
1 parent c094721 commit d8d608d
Show file tree
Hide file tree
Showing 2 changed files with 99 additions and 15 deletions.
107 changes: 94 additions & 13 deletions src/signTxOutput.c
Expand Up @@ -29,7 +29,7 @@ bool signTxOutput_isFinished()
case STATE_OUTPUT_TOP_LEVEL_DATA:
case STATE_OUTPUT_ASSET_GROUP:
case STATE_OUTPUT_TOKEN:
case STATE_OUTPUT_DATUM_HASH:
case STATE_OUTPUT_DATUM_OPTION:
case STATE_OUTPUT_CONFIRM:
return false;

Expand Down Expand Up @@ -65,7 +65,7 @@ static inline void advanceState()
subctx->state = STATE_OUTPUT_ASSET_GROUP;
} else {
if (subctx->includeDatumHash) {
subctx->state = STATE_OUTPUT_DATUM_HASH;
subctx->state = STATE_OUTPUT_DATUM_OPTION;
} else {
subctx->state = STATE_OUTPUT_CONFIRM;
}
Expand All @@ -92,7 +92,7 @@ static inline void advanceState()
if (subctx->currentAssetGroup == subctx->numAssetGroups) {
// the whole token bundle has been received
if (subctx->includeDatumHash) {
subctx->state = STATE_OUTPUT_DATUM_HASH;
subctx->state = STATE_OUTPUT_DATUM_OPTION;
} else {
subctx->state = STATE_OUTPUT_CONFIRM;
}
Expand All @@ -101,7 +101,7 @@ static inline void advanceState()
}
break;

case STATE_OUTPUT_DATUM_HASH:
case STATE_OUTPUT_DATUM_OPTION:
ASSERT(subctx->datumHashReceived);
subctx->state = STATE_OUTPUT_CONFIRM;
break;
Expand Down Expand Up @@ -134,8 +134,8 @@ static void signTx_handleOutput_address_ui_runStep()
ui_callback_fn_t* this_fn = signTx_handleOutput_address_ui_runStep;

ASSERT(subctx->stateData.output.outputType == OUTPUT_TYPE_ADDRESS_BYTES ||
subctx->stateData.output.outputType == OUTPUT_TYPE_POST_ALONZO_ADDRESS_BYTES
);
subctx->stateData.output.outputType == OUTPUT_TYPE_POST_ALONZO_ADDRESS_BYTES
);

UI_STEP_BEGIN(subctx->ui_step, this_fn);

Expand Down Expand Up @@ -169,9 +169,7 @@ static void signTx_handleOutput_address_ui_runStep()
static void signTx_handleOutput_addressBytes()
{
output_context_t* subctx = accessSubcontext();
ASSERT(subctx->stateData.output.outputType == OUTPUT_TYPE_ADDRESS_BYTES ||
subctx->stateData.output.outputType == OUTPUT_TYPE_POST_ALONZO_ADDRESS_BYTES
);
ASSERT(subctx->stateData.output.outputType == OUTPUT_TYPE_ADDRESS_BYTES);
security_policy_t policy = policyForSignTxOutputAddressBytes(
commonTxData->txSigningMode,
subctx->stateData.output.address.buffer, subctx->stateData.output.address.size,
Expand Down Expand Up @@ -294,7 +292,7 @@ static void signTx_handleOutput_addressParams_ui_runStep()
TRACE("outputType: %d", subctx->stateData.output.outputType);

ASSERT(subctx->stateData.output.outputType == OUTPUT_TYPE_ADDRESS_PARAMS ||
subctx->stateData.output.outputType == OUTPUT_TYPE_POST_ALONZO_ADDRESS_PARAMS);
subctx->stateData.output.outputType == OUTPUT_TYPE_POST_ALONZO_ADDRESS_PARAMS);

UI_STEP_BEGIN(subctx->ui_step, this_fn);

Expand Down Expand Up @@ -337,8 +335,7 @@ static void signTx_handleOutput_addressParams_ui_runStep()
static void signTx_handleOutput_addressParams()
{
output_context_t* subctx = accessSubcontext();
ASSERT(subctx->stateData.output.outputType == OUTPUT_TYPE_ADDRESS_PARAMS ||
subctx->stateData.output.outputType == OUTPUT_TYPE_POST_ALONZO_ADDRESS_PARAMS);
ASSERT(subctx->stateData.output.outputType == OUTPUT_TYPE_ADDRESS_PARAMS);
security_policy_t policy = policyForSignTxOutputAddressParams(
commonTxData->txSigningMode,
&subctx->stateData.output.params,
Expand Down Expand Up @@ -770,7 +767,7 @@ static void signTxOutput_handleDatumHashAPDU(const uint8_t* wireDataBuffer, size
{
{
// sanity checks
CHECK_STATE(STATE_OUTPUT_DATUM_HASH);
CHECK_STATE(STATE_OUTPUT_DATUM_OPTION);
ASSERT(wireDataSize < BUFFER_SIZE_PARANOIA);
}
output_context_t* subctx = accessSubcontext();
Expand Down Expand Up @@ -810,6 +807,84 @@ static void signTxOutput_handleDatumHashAPDU(const uint8_t* wireDataBuffer, size
signTxOutput_handleDatumHash_ui_runStep();
}

// ========================== DATUM OPTION =============================



static void signTxOutput_handleDatumOption_ui_runStep()
{
output_context_t* subctx = accessSubcontext();
TRACE("UI step %d", subctx->ui_step);
ui_callback_fn_t* this_fn = signTxOutput_handleDatumHash_ui_runStep;

UI_STEP_BEGIN(subctx->ui_step, this_fn);

UI_STEP(HANDLE_DATUM_HASH_STEP_DISPLAY) {
ui_displayBech32Screen(
"Datum hash",
"datum",
subctx->stateData.datumHash, OUTPUT_DATUM_HASH_LENGTH,
this_fn
);
}
UI_STEP(HANDLE_DATUM_HASH_STEP_RESPOND) {
respondSuccessEmptyMsg();

advanceState();
}
UI_STEP_END(HANDLE_DATUM_HASH_STEP_INVALID);
}

static void signTxOutput_handleDatumOptionAPDU(const uint8_t* wireDataBuffer, size_t wireDataSize)
{
{
// sanity checks
CHECK_STATE(STATE_OUTPUT_DATUM_OPTION);
ASSERT(wireDataSize < BUFFER_SIZE_PARANOIA);
}
output_context_t* subctx = accessSubcontext();
{
// parse data
TRACE_BUFFER(wireDataBuffer, wireDataSize);

read_view_t view = make_read_view(wireDataBuffer, wireDataBuffer + wireDataSize);
STATIC_ASSERT(SIZEOF(subctx->stateData.datumHash) == OUTPUT_DATUM_HASH_LENGTH, "wrong datum hash length");
subctx->stateData.datumOption = parse_u1be(&view);
TRACE("datumOption: %d", subctx->stateData.datumOption);
view_parseBuffer(subctx->stateData.datumHash, &view, OUTPUT_DATUM_HASH_LENGTH);
VALIDATE(view_remainingSize(&view) == 0, ERR_INVALID_DATA);

subctx->datumHashReceived = true;
}
{
// add to tx
TRACE("Adding datum hash to tx hash");
txHashBuilder_addOutput_datumOption(
&BODY_CTX->txHashBuilder,
MAP_BABBAGE,
subctx->stateData.datumOption,
subctx->stateData.datumHash, SIZEOF(subctx->stateData.datumHash));
}

{
// select UI step
security_policy_t policy = policyForSignTxOutputDatumHash(subctx->outputSecurityPolicy);
TRACE("Policy: %d", (int) policy);
ENSURE_NOT_DENIED(policy);

switch (policy) {
# define CASE(POLICY, UI_STEP) case POLICY: {subctx->ui_step=UI_STEP; break;}
CASE(POLICY_SHOW_BEFORE_RESPONSE, HANDLE_DATUM_HASH_STEP_DISPLAY);
CASE(POLICY_ALLOW_WITHOUT_PROMPT, HANDLE_DATUM_HASH_STEP_RESPOND);
# undef CASE
default:
THROW(ERR_NOT_IMPLEMENTED);
}
}

signTxOutput_handleDatumHash_ui_runStep(); //TODO: change this
}

// ============================== CONFIRM ==============================

enum {
Expand Down Expand Up @@ -886,6 +961,7 @@ enum {
APDU_INSTRUCTION_ASSET_GROUP = 0x31,
APDU_INSTRUCTION_TOKEN = 0x32,
APDU_INSTRUCTION_SCRIPT_DATUM_HASH = 0x34,
APDU_INSTRUCTION_SCRIPT_DATUM_OPTION = 0x35,
APDU_INSTRUCTION_CONFIRM = 0x33,
};

Expand All @@ -896,6 +972,7 @@ bool signTxOutput_isValidInstruction(uint8_t p2)
case APDU_INSTRUCTION_ASSET_GROUP:
case APDU_INSTRUCTION_TOKEN:
case APDU_INSTRUCTION_SCRIPT_DATUM_HASH:
case APDU_INSTRUCTION_SCRIPT_DATUM_OPTION:
case APDU_INSTRUCTION_CONFIRM:
return true;

Expand Down Expand Up @@ -925,6 +1002,10 @@ void signTxOutput_handleAPDU(uint8_t p2, const uint8_t* wireDataBuffer, size_t w
signTxOutput_handleDatumHashAPDU(wireDataBuffer, wireDataSize);
break;

case APDU_INSTRUCTION_SCRIPT_DATUM_OPTION:
signTxOutput_handleDatumOptionAPDU(wireDataBuffer, wireDataSize);
break;

case APDU_INSTRUCTION_CONFIRM:
signTxOutput_handleConfirmAPDU(wireDataBuffer, wireDataSize);
break;
Expand Down
7 changes: 5 additions & 2 deletions src/signTxOutput.h
Expand Up @@ -22,7 +22,7 @@ typedef enum {
STATE_OUTPUT_TOP_LEVEL_DATA = 2510,
STATE_OUTPUT_ASSET_GROUP = 2511,
STATE_OUTPUT_TOKEN = 2512,
STATE_OUTPUT_DATUM_HASH = 2513,
STATE_OUTPUT_DATUM_OPTION = 2513,
STATE_OUTPUT_CONFIRM = 2514,
STATE_OUTPUT_FINISHED = 2515
} sign_tx_output_state_t;
Expand Down Expand Up @@ -64,7 +64,10 @@ typedef struct {
token_group_t tokenGroup;
output_token_amount_t token;
};
uint8_t datumHash[OUTPUT_DATUM_HASH_LENGTH];
struct{
uint8_t datumOption;
uint8_t datumHash[OUTPUT_DATUM_HASH_LENGTH];
};
} stateData;

} output_context_t;
Expand Down

0 comments on commit d8d608d

Please sign in to comment.