diff --git a/extmod/modtrezorcrypto/modtrezorcrypto-bip32.h b/extmod/modtrezorcrypto/modtrezorcrypto-bip32.h index 16ac3c866..b3057521b 100644 --- a/extmod/modtrezorcrypto/modtrezorcrypto-bip32.h +++ b/extmod/modtrezorcrypto/modtrezorcrypto-bip32.h @@ -15,6 +15,9 @@ typedef struct _mp_obj_HDNode_t { HDNode hdnode; } mp_obj_HDNode_t; +#define XPUB_MAXLEN 128 +#define ADDRESS_MAXLEN 36 + /// def trezor.crypto.HDNode.derive(index: int) -> None: /// ''' /// Derive a BIP0032 child node in place. @@ -74,7 +77,7 @@ STATIC mp_obj_t serialize_public_private(mp_obj_t self, bool use_public) { mp_obj_HDNode_t *o = MP_OBJ_TO_PTR(self); vstr_t vstr; - vstr_init(&vstr, 120); // maximum length of base58-serialized node + vstr_init(&vstr, XPUB_MAXLEN); int written; if (use_public) { @@ -149,6 +152,16 @@ STATIC mp_obj_t mod_TrezorCrypto_HDNode_chain_code(mp_obj_t self) { } STATIC MP_DEFINE_CONST_FUN_OBJ_1(mod_TrezorCrypto_HDNode_chain_code_obj, mod_TrezorCrypto_HDNode_chain_code); +/// def trezor.crypto.HDNode.private_key() -> bytes: +/// ''' +/// Returns a private key of the HD node. +/// ''' +STATIC mp_obj_t mod_TrezorCrypto_HDNode_private_key(mp_obj_t self) { + mp_obj_HDNode_t *o = MP_OBJ_TO_PTR(self); + return mp_obj_new_str_of_type(&mp_type_bytes, o->hdnode.private_key, sizeof(o->hdnode.private_key)); +} +STATIC MP_DEFINE_CONST_FUN_OBJ_1(mod_TrezorCrypto_HDNode_private_key_obj, mod_TrezorCrypto_HDNode_private_key); + /// def trezor.crypto.HDNode.public_key() -> bytes: /// ''' /// Returns a public key of the HD node. @@ -160,15 +173,22 @@ STATIC mp_obj_t mod_TrezorCrypto_HDNode_public_key(mp_obj_t self) { } STATIC MP_DEFINE_CONST_FUN_OBJ_1(mod_TrezorCrypto_HDNode_public_key_obj, mod_TrezorCrypto_HDNode_public_key); -/// def trezor.crypto.HDNode.private_key() -> bytes: +/// def trezor.crypto.HDNode.address(version: int) -> str: /// ''' -/// Returns a private key of the HD node. +/// Compute a base58-encoded address string from the HD node. /// ''' -STATIC mp_obj_t mod_TrezorCrypto_HDNode_private_key(mp_obj_t self) { +STATIC mp_obj_t mod_TrezorCrypto_HDNode_address(mp_obj_t self, mp_obj_t version) { mp_obj_HDNode_t *o = MP_OBJ_TO_PTR(self); - return mp_obj_new_str_of_type(&mp_type_bytes, o->hdnode.private_key, sizeof(o->hdnode.private_key)); + + uint32_t v = mp_obj_get_int_truncated(version); + vstr_t vstr; + vstr_init(&vstr, ADDRESS_MAXLEN); + + hdnode_get_address(&o->hdnode, v, vstr.buf, vstr.alloc); + vstr.len = strlen(vstr.buf); + return mp_obj_new_str_from_vstr(&mp_type_str, &vstr); } -STATIC MP_DEFINE_CONST_FUN_OBJ_1(mod_TrezorCrypto_HDNode_private_key_obj, mod_TrezorCrypto_HDNode_private_key); +STATIC MP_DEFINE_CONST_FUN_OBJ_2(mod_TrezorCrypto_HDNode_address_obj, mod_TrezorCrypto_HDNode_address); STATIC const mp_rom_map_elem_t mod_TrezorCrypto_HDNode_locals_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_derive), MP_ROM_PTR(&mod_TrezorCrypto_HDNode_derive_obj) }, @@ -182,6 +202,7 @@ STATIC const mp_rom_map_elem_t mod_TrezorCrypto_HDNode_locals_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_chain_code), MP_ROM_PTR(&mod_TrezorCrypto_HDNode_chain_code_obj) }, { MP_ROM_QSTR(MP_QSTR_private_key), MP_ROM_PTR(&mod_TrezorCrypto_HDNode_private_key_obj) }, { MP_ROM_QSTR(MP_QSTR_public_key), MP_ROM_PTR(&mod_TrezorCrypto_HDNode_public_key_obj) }, + { MP_ROM_QSTR(MP_QSTR_address), MP_ROM_PTR(&mod_TrezorCrypto_HDNode_address_obj) }, }; STATIC MP_DEFINE_CONST_DICT(mod_TrezorCrypto_HDNode_locals_dict, mod_TrezorCrypto_HDNode_locals_dict_table);