1
0
mirror of https://github.com/trezor/trezor-firmware.git synced 2024-11-30 03:18:20 +00:00

Remove add_hash_type fields.

The 4 byte hash_type/forkid is part of the signed message, but not
part of the transaction.  Instead of hacking it into the transaction,
add it after the transaction when computing the signature.
This commit is contained in:
Jochen Hoenicke 2017-10-31 22:21:51 +01:00 committed by Pavol Rusnak
parent d39e4be1c8
commit a8bc3cb6bd
3 changed files with 10 additions and 21 deletions

View File

@ -453,7 +453,7 @@ void signing_init(uint32_t _inputs_count, uint32_t _outputs_count, const CoinInf
multisig_fp_mismatch = false; multisig_fp_mismatch = false;
next_nonsegwit_input = 0xffffffff; next_nonsegwit_input = 0xffffffff;
tx_init(&to, inputs_count, outputs_count, version, lock_time, 0, false); tx_init(&to, inputs_count, outputs_count, version, lock_time, 0);
// segwit hashes for hashPrevouts and hashSequence // segwit hashes for hashPrevouts and hashSequence
sha256_Init(&hashers[0]); sha256_Init(&hashers[0]);
sha256_Init(&hashers[1]); sha256_Init(&hashers[1]);
@ -700,6 +700,8 @@ static bool signing_sign_input(void) {
return false; return false;
} }
uint32_t hash_type = signing_hash_type();
sha256_Update(&ti.ctx, (const uint8_t *)&hash_type, 4);
tx_hash_final(&ti, hash, false); tx_hash_final(&ti, hash, false);
resp.has_serialized = true; resp.has_serialized = true;
if (!signing_sign_hash(&input, privkey, pubkey, hash)) if (!signing_sign_hash(&input, privkey, pubkey, hash))
@ -867,7 +869,7 @@ void signing_txack(TransactionType *tx)
} }
return; return;
case STAGE_REQUEST_2_PREV_META: case STAGE_REQUEST_2_PREV_META:
tx_init(&tp, tx->inputs_cnt, tx->outputs_cnt, tx->version, tx->lock_time, tx->extra_data_len, false); tx_init(&tp, tx->inputs_cnt, tx->outputs_cnt, tx->version, tx->lock_time, tx->extra_data_len);
progress_meta_step = progress_step / (tp.inputs_len + tp.outputs_len); progress_meta_step = progress_step / (tp.inputs_len + tp.outputs_len);
idx2 = 0; idx2 = 0;
if (tp.inputs_len > 0) { if (tp.inputs_len > 0) {
@ -940,7 +942,7 @@ void signing_txack(TransactionType *tx)
case STAGE_REQUEST_4_INPUT: case STAGE_REQUEST_4_INPUT:
progress = 500 + ((signatures * progress_step + idx2 * progress_meta_step) >> PROGRESS_PRECISION); progress = 500 + ((signatures * progress_step + idx2 * progress_meta_step) >> PROGRESS_PRECISION);
if (idx2 == 0) { if (idx2 == 0) {
tx_init(&ti, inputs_count, outputs_count, version, lock_time, 0, true); tx_init(&ti, inputs_count, outputs_count, version, lock_time, 0);
sha256_Init(&hashers[0]); sha256_Init(&hashers[0]);
} }
// check prevouts and script type // check prevouts and script type

View File

@ -455,25 +455,13 @@ uint32_t tx_serialize_middle_hash(TxStruct *tx)
uint32_t tx_serialize_footer(TxStruct *tx, uint8_t *out) uint32_t tx_serialize_footer(TxStruct *tx, uint8_t *out)
{ {
memcpy(out, &(tx->lock_time), 4); memcpy(out, &(tx->lock_time), 4);
if (tx->add_hash_type) {
uint32_t ht = 1;
memcpy(out + 4, &ht, 4);
return 8;
} else {
return 4; return 4;
}
} }
uint32_t tx_serialize_footer_hash(TxStruct *tx) uint32_t tx_serialize_footer_hash(TxStruct *tx)
{ {
sha256_Update(&(tx->ctx), (const uint8_t *)&(tx->lock_time), 4); sha256_Update(&(tx->ctx), (const uint8_t *)&(tx->lock_time), 4);
if (tx->add_hash_type) {
uint32_t ht = 1;
sha256_Update(&(tx->ctx), (const uint8_t *)&ht, 4);
return 8;
} else {
return 4; return 4;
}
} }
uint32_t tx_serialize_output(TxStruct *tx, const TxOutputBinType *output, uint8_t *out) uint32_t tx_serialize_output(TxStruct *tx, const TxOutputBinType *output, uint8_t *out)
@ -545,13 +533,12 @@ uint32_t tx_serialize_extra_data_hash(TxStruct *tx, const uint8_t *data, uint32_
return datalen; return datalen;
} }
void tx_init(TxStruct *tx, uint32_t inputs_len, uint32_t outputs_len, uint32_t version, uint32_t lock_time, uint32_t extra_data_len, bool add_hash_type) void tx_init(TxStruct *tx, uint32_t inputs_len, uint32_t outputs_len, uint32_t version, uint32_t lock_time, uint32_t extra_data_len)
{ {
tx->inputs_len = inputs_len; tx->inputs_len = inputs_len;
tx->outputs_len = outputs_len; tx->outputs_len = outputs_len;
tx->version = version; tx->version = version;
tx->lock_time = lock_time; tx->lock_time = lock_time;
tx->add_hash_type = add_hash_type;
tx->have_inputs = 0; tx->have_inputs = 0;
tx->have_outputs = 0; tx->have_outputs = 0;
tx->extra_data_len = extra_data_len; tx->extra_data_len = extra_data_len;

View File

@ -33,7 +33,7 @@ typedef struct {
uint32_t version; uint32_t version;
uint32_t lock_time; uint32_t lock_time;
bool add_hash_type, is_segwit; bool is_segwit;
uint32_t have_inputs; uint32_t have_inputs;
uint32_t have_outputs; uint32_t have_outputs;
@ -64,7 +64,7 @@ uint32_t tx_serialize_footer(TxStruct *tx, uint8_t *out);
uint32_t tx_serialize_input(TxStruct *tx, const TxInputType *input, uint8_t *out); uint32_t tx_serialize_input(TxStruct *tx, const TxInputType *input, uint8_t *out);
uint32_t tx_serialize_output(TxStruct *tx, const TxOutputBinType *output, uint8_t *out); uint32_t tx_serialize_output(TxStruct *tx, const TxOutputBinType *output, uint8_t *out);
void tx_init(TxStruct *tx, uint32_t inputs_len, uint32_t outputs_len, uint32_t version, uint32_t lock_time, uint32_t extra_data_len, bool add_hash_type); void tx_init(TxStruct *tx, uint32_t inputs_len, uint32_t outputs_len, uint32_t version, uint32_t lock_time, uint32_t extra_data_len);
uint32_t tx_serialize_header_hash(TxStruct *tx); uint32_t tx_serialize_header_hash(TxStruct *tx);
uint32_t tx_serialize_input_hash(TxStruct *tx, const TxInputType *input); uint32_t tx_serialize_input_hash(TxStruct *tx, const TxInputType *input);
uint32_t tx_serialize_output_hash(TxStruct *tx, const TxOutputBinType *output); uint32_t tx_serialize_output_hash(TxStruct *tx, const TxOutputBinType *output);