1
0
mirror of https://github.com/trezor/trezor-firmware.git synced 2024-11-13 19:18:56 +00:00

refactor hdnode_public_ckd_address_optimized

This commit is contained in:
Pavol Rusnak 2017-07-24 22:57:20 +02:00
parent cfe8f39cd4
commit c950342063
No known key found for this signature in database
GPG Key ID: 91F3B339B9A02A3D
5 changed files with 28 additions and 22 deletions

28
bip32.c
View File

@ -287,7 +287,7 @@ int hdnode_public_ckd(HDNode *inout, uint32_t i)
return 1;
}
int hdnode_public_ckd_address_optimized(const curve_point *pub, const uint8_t *chain_code, uint32_t i, uint32_t version, char *addr, int addrsize, bool segwit)
void hdnode_public_ckd_address_optimized(const curve_point *pub, const uint8_t *chain_code, uint32_t i, uint32_t version, char *addr, int addrsize, int addrformat)
{
uint8_t child_pubkey[33];
curve_point b;
@ -296,25 +296,13 @@ int hdnode_public_ckd_address_optimized(const curve_point *pub, const uint8_t *c
child_pubkey[0] = 0x02 | (b.y.val[0] & 0x01);
bn_write_be(&b.x, child_pubkey + 1);
if (!segwit) {
ecdsa_get_address(child_pubkey, version, addr, addrsize);
return 1;
} else {
uint8_t raw[32];
size_t prelen = address_prefix_bytes_len(version);
uint8_t digest[MAX_ADDR_RAW_SIZE];
raw[0] = 0; // version byte
raw[1] = 20; // push 20 bytes
ecdsa_get_pubkeyhash(child_pubkey, raw + 2);
sha256_Raw(raw, 22, digest);
address_write_prefix_bytes(version, raw);
ripemd160(digest, 32, raw + prelen);
if (!base58_encode_check(raw, prelen + 20, addr, MAX_ADDR_SIZE)) {
return 0;
}
return 1;
switch (addrformat) {
case 1: // Segwit-in-P2SH
ecdsa_get_address_segwit(child_pubkey, version, addr, addrsize);
break;
default: // normal address
ecdsa_get_address(child_pubkey, version, addr, addrsize);
break;
}
}

View File

@ -58,7 +58,7 @@ int hdnode_public_ckd_cp(const ecdsa_curve *curve, const curve_point *parent, co
int hdnode_public_ckd(HDNode *inout, uint32_t i);
int hdnode_public_ckd_address_optimized(const curve_point *pub, const uint8_t *chain_code, uint32_t i, uint32_t version, char *addr, int addrsize, bool segwit);
void hdnode_public_ckd_address_optimized(const curve_point *pub, const uint8_t *chain_code, uint32_t i, uint32_t version, char *addr, int addrsize, int addrformat);
#if USE_BIP32_CACHE
int hdnode_private_ckd_cached(HDNode *inout, const uint32_t *i, size_t i_count, uint32_t *fingerprint);

17
ecdsa.c
View File

@ -907,6 +907,23 @@ void ecdsa_get_address(const uint8_t *pub_key, uint32_t version, char *addr, int
MEMSET_BZERO(raw, sizeof(raw));
}
void ecdsa_get_address_segwit(const uint8_t *pub_key, uint32_t version, char *addr, int addrsize)
{
uint8_t raw[MAX_ADDR_RAW_SIZE];
size_t prefix_len = address_prefix_bytes_len(version);
uint8_t digest[32];
raw[0] = 0; // version byte
raw[1] = 20; // push 20 bytes
ecdsa_get_pubkeyhash(pub_key, raw + 2);
sha256_Raw(raw, 22, digest);
address_write_prefix_bytes(version, raw);
ripemd160(digest, 32, raw + prefix_len);
base58_encode_check(raw, prefix_len + 20, addr, addrsize);
// not as important to clear these, but we might as well
MEMSET_BZERO(raw, sizeof(raw));
MEMSET_BZERO(digest, sizeof(digest));
}
void ecdsa_get_wif(const uint8_t *priv_key, uint32_t version, char *wif, int wifsize)
{
uint8_t wif_raw[MAX_WIF_RAW_SIZE];

View File

@ -74,6 +74,7 @@ void ecdsa_get_public_key65(const ecdsa_curve *curve, const uint8_t *priv_key, u
void ecdsa_get_pubkeyhash(const uint8_t *pub_key, uint8_t *pubkeyhash);
void ecdsa_get_address_raw(const uint8_t *pub_key, uint32_t version, uint8_t *addr_raw);
void ecdsa_get_address(const uint8_t *pub_key, uint32_t version, char *addr, int addrsize);
void ecdsa_get_address_segwit(const uint8_t *pub_key, uint32_t version, char *addr, int addrsize);
void ecdsa_get_wif(const uint8_t *priv_key, uint32_t version, char *wif, int wifsize);
int ecdsa_address_decode(const char *addr, uint32_t version, uint8_t *out);

View File

@ -1021,7 +1021,7 @@ START_TEST(test_bip32_optimized)
hdnode_fill_public_key(&node);
ecdsa_get_address(node.public_key, 0, addr1, sizeof(addr1));
// optimized
hdnode_public_ckd_address_optimized(&pub, root.chain_code, i, 0, addr2, sizeof(addr2), false);
hdnode_public_ckd_address_optimized(&pub, root.chain_code, i, 0, addr2, sizeof(addr2), 0);
// check
ck_assert_str_eq(addr1, addr2);
}