mirror of
https://github.com/trezor/trezor-firmware.git
synced 2025-01-11 16:00:57 +00:00
legacy: drop zcash v3 tx signing support
This commit is contained in:
parent
10387e1869
commit
b8063e882b
@ -494,12 +494,6 @@ void signing_init(const SignTx *msg, const CoinInfo *_coin,
|
|||||||
version = msg->version;
|
version = msg->version;
|
||||||
lock_time = msg->lock_time;
|
lock_time = msg->lock_time;
|
||||||
|
|
||||||
if (coin->overwintered && !msg->has_version_group_id) {
|
|
||||||
fsm_sendFailure(FailureType_Failure_DataError,
|
|
||||||
_("Version group ID must be set."));
|
|
||||||
signing_abort();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (!coin->overwintered) {
|
if (!coin->overwintered) {
|
||||||
if (msg->has_version_group_id) {
|
if (msg->has_version_group_id) {
|
||||||
fsm_sendFailure(FailureType_Failure_DataError,
|
fsm_sendFailure(FailureType_Failure_DataError,
|
||||||
@ -519,19 +513,26 @@ void signing_init(const SignTx *msg, const CoinInfo *_coin,
|
|||||||
expiry = (coin->decred || coin->overwintered) ? msg->expiry : 0;
|
expiry = (coin->decred || coin->overwintered) ? msg->expiry : 0;
|
||||||
timestamp = coin->timestamp ? msg->timestamp : 0;
|
timestamp = coin->timestamp ? msg->timestamp : 0;
|
||||||
if (coin->overwintered) {
|
if (coin->overwintered) {
|
||||||
|
if (!msg->has_version_group_id) {
|
||||||
|
fsm_sendFailure(FailureType_Failure_DataError,
|
||||||
|
_("Version group ID must be set."));
|
||||||
|
signing_abort();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!msg->has_branch_id) {
|
||||||
|
fsm_sendFailure(FailureType_Failure_DataError,
|
||||||
|
_("Branch ID must be set."));
|
||||||
|
signing_abort();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (version != 4) {
|
||||||
|
fsm_sendFailure(FailureType_Failure_DataError,
|
||||||
|
_("Unsupported transaction version."));
|
||||||
|
signing_abort();
|
||||||
|
return;
|
||||||
|
}
|
||||||
version_group_id = msg->version_group_id;
|
version_group_id = msg->version_group_id;
|
||||||
branch_id = msg->branch_id;
|
branch_id = msg->branch_id;
|
||||||
if (branch_id == 0) {
|
|
||||||
// set default values for Zcash if branch_id is unset
|
|
||||||
switch (version) {
|
|
||||||
case 3:
|
|
||||||
branch_id = 0x5BA81B19; // Overwinter
|
|
||||||
break;
|
|
||||||
case 4:
|
|
||||||
branch_id = 0x76B809BB; // Sapling
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
version_group_id = 0;
|
version_group_id = 0;
|
||||||
branch_id = 0;
|
branch_id = 0;
|
||||||
@ -1006,40 +1007,6 @@ static void signing_hash_bip143(const TxInputType *txinput, uint8_t *hash) {
|
|||||||
|
|
||||||
#if !BITCOIN_ONLY
|
#if !BITCOIN_ONLY
|
||||||
|
|
||||||
static void signing_hash_zip143(const TxInputType *txinput, uint8_t *hash) {
|
|
||||||
uint32_t hash_type = signing_hash_type();
|
|
||||||
uint8_t personal[16] = {0};
|
|
||||||
memcpy(personal, "ZcashSigHash", 12);
|
|
||||||
memcpy(personal + 12, &branch_id, 4);
|
|
||||||
Hasher hasher_preimage = {0};
|
|
||||||
hasher_InitParam(&hasher_preimage, HASHER_BLAKE2B_PERSONAL, personal,
|
|
||||||
sizeof(personal));
|
|
||||||
uint32_t ver = version | TX_OVERWINTERED; // 1. nVersion | fOverwintered
|
|
||||||
hasher_Update(&hasher_preimage, (const uint8_t *)&ver, 4);
|
|
||||||
hasher_Update(&hasher_preimage, (const uint8_t *)&version_group_id,
|
|
||||||
4); // 2. nVersionGroupId
|
|
||||||
hasher_Update(&hasher_preimage, hash_prevouts, 32); // 3. hashPrevouts
|
|
||||||
hasher_Update(&hasher_preimage, hash_sequence, 32); // 4. hashSequence
|
|
||||||
hasher_Update(&hasher_preimage, hash_outputs, 32); // 5. hashOutputs
|
|
||||||
// 6. hashJoinSplits
|
|
||||||
hasher_Update(&hasher_preimage, (const uint8_t *)"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 32);
|
|
||||||
hasher_Update(&hasher_preimage, (const uint8_t *)&lock_time,
|
|
||||||
4); // 7. nLockTime
|
|
||||||
hasher_Update(&hasher_preimage, (const uint8_t *)&expiry,
|
|
||||||
4); // 8. expiryHeight
|
|
||||||
hasher_Update(&hasher_preimage, (const uint8_t *)&hash_type,
|
|
||||||
4); // 9. nHashType
|
|
||||||
|
|
||||||
tx_prevout_hash(&hasher_preimage, txinput); // 10a. outpoint
|
|
||||||
tx_script_hash(&hasher_preimage, txinput->script_sig.size,
|
|
||||||
txinput->script_sig.bytes); // 10b. scriptCode
|
|
||||||
hasher_Update(&hasher_preimage, (const uint8_t *)&txinput->amount,
|
|
||||||
8); // 10c. value
|
|
||||||
tx_sequence_hash(&hasher_preimage, txinput); // 10d. nSequence
|
|
||||||
|
|
||||||
hasher_Final(&hasher_preimage, hash);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void signing_hash_zip243(const TxInputType *txinput, uint8_t *hash) {
|
static void signing_hash_zip243(const TxInputType *txinput, uint8_t *hash) {
|
||||||
uint32_t hash_type = signing_hash_type();
|
uint32_t hash_type = signing_hash_type();
|
||||||
uint8_t personal[16] = {0};
|
uint8_t personal[16] = {0};
|
||||||
@ -1640,20 +1607,14 @@ void signing_txack(TransactionType *tx) {
|
|||||||
uint8_t hash[32] = {0};
|
uint8_t hash[32] = {0};
|
||||||
#if !BITCOIN_ONLY
|
#if !BITCOIN_ONLY
|
||||||
if (coin->overwintered) {
|
if (coin->overwintered) {
|
||||||
switch (version) {
|
if (version != 4) {
|
||||||
case 3:
|
fsm_sendFailure(
|
||||||
signing_hash_zip143(&tx->inputs[0], hash);
|
FailureType_Failure_DataError,
|
||||||
break;
|
_("Unsupported version for overwintered transaction"));
|
||||||
case 4:
|
signing_abort();
|
||||||
signing_hash_zip243(&tx->inputs[0], hash);
|
return;
|
||||||
break;
|
|
||||||
default:
|
|
||||||
fsm_sendFailure(
|
|
||||||
FailureType_Failure_DataError,
|
|
||||||
_("Unsupported version for overwintered transaction"));
|
|
||||||
signing_abort();
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
signing_hash_zip243(&tx->inputs[0], hash);
|
||||||
} else
|
} else
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
|
@ -684,19 +684,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 !BITCOIN_ONLY
|
#if !BITCOIN_ONLY
|
||||||
if (tx->overwintered) {
|
if (tx->overwintered && tx->version == 4) {
|
||||||
if (tx->version == 3) {
|
memcpy(out + 4, &(tx->expiry), 4);
|
||||||
memcpy(out + 4, &(tx->expiry), 4);
|
memzero(out + 8, 8); // valueBalance
|
||||||
out[8] = 0x00; // nJoinSplit
|
out[16] = 0x00; // nShieldedSpend
|
||||||
return 9;
|
out[17] = 0x00; // nShieldedOutput
|
||||||
} else if (tx->version == 4) {
|
out[18] = 0x00; // nJoinSplit
|
||||||
memcpy(out + 4, &(tx->expiry), 4);
|
return 19;
|
||||||
memzero(out + 8, 8); // valueBalance
|
|
||||||
out[16] = 0x00; // nShieldedSpend
|
|
||||||
out[17] = 0x00; // nShieldedOutput
|
|
||||||
out[18] = 0x00; // nJoinSplit
|
|
||||||
return 19;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (tx->is_decred) {
|
if (tx->is_decred) {
|
||||||
memcpy(out + 4, &(tx->expiry), 4);
|
memcpy(out + 4, &(tx->expiry), 4);
|
||||||
|
Loading…
Reference in New Issue
Block a user