Skip to content

Commit add3fdd

Browse files
committed
bip32: add calls to compute the length of a path string
1 parent 7864f4b commit add3fdd

File tree

9 files changed

+84
-13
lines changed

9 files changed

+84
-13
lines changed

include/wally.hpp

+14-2
Original file line numberDiff line numberDiff line change
@@ -202,17 +202,29 @@ inline int bip32_key_unserialize_alloc(const BYTES& bytes, struct ext_key** outp
202202
}
203203

204204
template <class PATH_STR>
205-
inline int bip32_path_from_str(const PATH_STR& path_str, uint32_t child_num, uint32_t multi_index, uint32_t flags, uint32_t* child_path_out, uint32_t child_path_out_len, size_t* written) {
205+
inline int bip32_path_from_str(const PATH_STR& path_str, uint32_t child_num, uint32_t multi_index, uint32_t flags, uint32_t* child_path_out, size_t child_path_out_len, size_t* written) {
206206
int ret = ::bip32_path_from_str(detail::get_p(path_str), child_num, multi_index, flags, child_path_out, child_path_out_len, written);
207207
return detail::check_ret(__FUNCTION__, ret);
208208
}
209209

210210
template <class PATH_STR>
211-
inline int bip32_path_from_str_n(const PATH_STR& path_str, size_t path_str_len, uint32_t child_num, uint32_t multi_index, uint32_t flags, uint32_t* child_path_out, uint32_t child_path_out_len, size_t* written) {
211+
inline int bip32_path_from_str_len(const PATH_STR& path_str, uint32_t child_num, uint32_t multi_index, uint32_t flags, size_t* written) {
212+
int ret = ::bip32_path_from_str_len(detail::get_p(path_str), child_num, multi_index, flags, written);
213+
return detail::check_ret(__FUNCTION__, ret);
214+
}
215+
216+
template <class PATH_STR>
217+
inline int bip32_path_from_str_n(const PATH_STR& path_str, size_t path_str_len, uint32_t child_num, uint32_t multi_index, uint32_t flags, uint32_t* child_path_out, size_t child_path_out_len, size_t* written) {
212218
int ret = ::bip32_path_from_str_n(detail::get_p(path_str), path_str_len, child_num, multi_index, flags, child_path_out, child_path_out_len, written);
213219
return detail::check_ret(__FUNCTION__, ret);
214220
}
215221

222+
template <class PATH_STR>
223+
inline int bip32_path_from_str_n_len(const PATH_STR& path_str, size_t path_str_len, uint32_t child_num, uint32_t multi_index, uint32_t flags, size_t* written) {
224+
int ret = ::bip32_path_from_str_n_len(detail::get_p(path_str), path_str_len, child_num, multi_index, flags, written);
225+
return detail::check_ret(__FUNCTION__, ret);
226+
}
227+
216228
template <class PATH_STR>
217229
inline int bip32_path_str_get_features(const PATH_STR& path_str, uint32_t* value_out) {
218230
int ret = ::bip32_path_str_get_features(detail::get_p(path_str), value_out);

include/wally_bip32.h

+31-2
Original file line numberDiff line numberDiff line change
@@ -465,6 +465,22 @@ WALLY_CORE_API int bip32_key_get_fingerprint(
465465
unsigned char *bytes_out,
466466
size_t len);
467467

468+
/**
469+
* Get the number of child path elements in a BIP32 path string.
470+
*
471+
* :param path_str: The BIP32 path string of child numbers to convert from.
472+
* :param child_num: The child number to use if ``path_str`` contains a ``*`` wildcard.
473+
* :param multi_index: The multi-path item to use if ``path_str`` contains a ``<>`` multi-path.
474+
* :param flags: :ref:`bip32-flags` controlling path parsing behaviour.
475+
* :param written: Destination for the number of path elements in the path string.
476+
*/
477+
WALLY_CORE_API int bip32_path_from_str_len(
478+
const char *path_str,
479+
uint32_t child_num,
480+
uint32_t multi_index,
481+
uint32_t flags,
482+
size_t *written);
483+
468484
/**
469485
* Convert a BIP32 path string to a path.
470486
*
@@ -482,7 +498,20 @@ WALLY_CORE_API int bip32_path_from_str(
482498
uint32_t multi_index,
483499
uint32_t flags,
484500
uint32_t *child_path_out,
485-
uint32_t child_path_out_len,
501+
size_t child_path_out_len,
502+
size_t *written);
503+
504+
/**
505+
* Get the number of child path elements in a known-length BIP32 path string.
506+
*
507+
* See `bip32_path_from_str_len`.
508+
*/
509+
WALLY_CORE_API int bip32_path_from_str_n_len(
510+
const char *path_str,
511+
size_t path_str_len,
512+
uint32_t child_num,
513+
uint32_t multi_index,
514+
uint32_t flags,
486515
size_t *written);
487516

488517
/**
@@ -497,7 +526,7 @@ WALLY_CORE_API int bip32_path_from_str_n(
497526
uint32_t multi_index,
498527
uint32_t flags,
499528
uint32_t *child_path_out,
500-
uint32_t child_path_out_len,
529+
size_t child_path_out_len,
501530
size_t *written);
502531

503532
/**

src/bip32.c

+21-3
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ static bool is_hardened_indicator(char c, bool allow_upper, uint32_t *features)
8989
static int path_from_str_n(const char *str, size_t str_len,
9090
uint32_t child_num, uint32_t multi_index,
9191
uint32_t *features, uint32_t flags,
92-
uint32_t *child_path, uint32_t child_path_len,
92+
uint32_t *child_path, size_t child_path_len,
9393
size_t *written)
9494
{
9595
const bool allow_upper = flags & BIP32_FLAG_ALLOW_UPPER;
@@ -242,17 +242,27 @@ static int path_from_str_n(const char *str, size_t str_len,
242242
int bip32_path_from_str_n(const char *str, size_t str_len,
243243
uint32_t child_num, uint32_t multi_index,
244244
uint32_t flags,
245-
uint32_t *child_path, uint32_t child_path_len,
245+
uint32_t *child_path, size_t child_path_len,
246246
size_t *written)
247247
{
248248
uint32_t features;
249249
return path_from_str_n(str, str_len, child_num, multi_index, &features,
250250
flags, child_path, child_path_len, written);
251251
}
252252

253+
int bip32_path_from_str_n_len(const char *str, size_t str_len,
254+
uint32_t child_num, uint32_t multi_index,
255+
uint32_t flags,
256+
size_t *written)
257+
{
258+
uint32_t child_path;
259+
return bip32_path_from_str_n(str, str_len, child_num, multi_index,
260+
flags, &child_path, 1, written);
261+
}
262+
253263
int bip32_path_from_str(const char *str, uint32_t child_num,
254264
uint32_t multi_index, uint32_t flags,
255-
uint32_t *child_path, uint32_t child_path_len,
265+
uint32_t *child_path, size_t child_path_len,
256266
size_t *written)
257267
{
258268
uint32_t features;
@@ -261,6 +271,14 @@ int bip32_path_from_str(const char *str, uint32_t child_num,
261271
child_path, child_path_len, written);
262272
}
263273

274+
int bip32_path_from_str_len(const char *str, uint32_t child_num,
275+
uint32_t multi_index, uint32_t flags,
276+
size_t *written)
277+
{
278+
return bip32_path_from_str_n_len(str, str ? strlen(str) : 0, child_num,
279+
multi_index, flags, written);
280+
}
281+
264282
int bip32_path_str_n_get_features(const char *str, size_t str_len,
265283
uint32_t *value_out)
266284
{

src/swig_java/swig.i

+2
Original file line numberDiff line numberDiff line change
@@ -499,6 +499,8 @@ static jobjectArray create_jstringArray(JNIEnv *jenv, char **p, size_t len) {
499499
%rename("bip32_key_unserialize") bip32_key_unserialize_alloc;
500500
%returns_struct(bip32_key_with_tweak_from_parent_path_alloc, ext_key);
501501
%rename("bip32_key_with_tweak_from_parent_path") bip32_key_with_tweak_from_parent_path_alloc;
502+
%returns_size_t(bip32_path_from_str_len);
503+
%returns_size_t(bip32_path_from_str_n_len);
502504
%returns_array_(bip38_raw_from_private_key, 6, 7, BIP38_SERIALIZED_LEN);
503505
%returns_string(bip38_from_private_key);
504506
%returns_array_(bip38_raw_to_private_key, 6, 7, 32);

src/swig_python/python_extra.py_in

+2
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,8 @@ bip32_key_get_pub_key = _wrap_bin(bip32_key_get_pub_key, EC_PUBLIC_KEY_LEN)
138138
bip32_key_init = bip32_key_init_alloc
139139
bip32_key_serialize = _wrap_bin(bip32_key_serialize, BIP32_SERIALIZED_LEN)
140140
bip32_key_unserialize = bip32_key_unserialize_alloc
141+
bip32_path_from_str = _wrap_int_array(bip32_path_from_str, bip32_path_from_str_len)
142+
bip32_path_from_str_n = _wrap_int_array(bip32_path_from_str_n, bip32_path_from_str_n_len)
141143
bip340_tagged_hash = _wrap_bin(bip340_tagged_hash, SHA256_LEN)
142144
bip38_raw_from_private_key = _wrap_bin(bip38_raw_from_private_key, BIP38_SERIALIZED_LEN)
143145
bip38_raw_to_private_key = _wrap_bin(bip38_raw_to_private_key, EC_PRIVATE_KEY_LEN)

src/test/util.py

+4-2
Original file line numberDiff line numberDiff line change
@@ -235,8 +235,10 @@ class wally_psbt(Structure):
235235
('bip32_key_unserialize_alloc', c_int, [c_void_p, c_size_t, POINTER(POINTER(ext_key))]),
236236
('bip32_key_with_tweak_from_parent_path', c_int, [POINTER(ext_key), POINTER(c_uint32), c_size_t, c_uint32, POINTER(ext_key)]),
237237
('bip32_key_with_tweak_from_parent_path_alloc', c_int, [POINTER(ext_key), POINTER(c_uint32), c_size_t, c_uint32, POINTER(POINTER(ext_key))]),
238-
('bip32_path_from_str', c_int, [c_char_p, c_uint32, c_uint32, c_uint32, POINTER(c_uint32), c_uint32, c_size_t_p]),
239-
('bip32_path_from_str_n', c_int, [c_char_p, c_size_t, c_uint32, c_uint32, c_uint32, POINTER(c_uint32), c_uint32, c_size_t_p]),
238+
('bip32_path_from_str', c_int, [c_char_p, c_uint32, c_uint32, c_uint32, POINTER(c_uint32), c_size_t, c_size_t_p]),
239+
('bip32_path_from_str_len', c_int, [c_char_p, c_uint32, c_uint32, c_uint32, c_size_t_p]),
240+
('bip32_path_from_str_n', c_int, [c_char_p, c_size_t, c_uint32, c_uint32, c_uint32, POINTER(c_uint32), c_size_t, c_size_t_p]),
241+
('bip32_path_from_str_n_len', c_int, [c_char_p, c_size_t, c_uint32, c_uint32, c_uint32, c_size_t_p]),
240242
('bip32_path_str_get_features', c_int, [c_char_p, c_uint32_p]),
241243
('bip32_path_str_n_get_features', c_int, [c_char_p, c_size_t, c_uint32_p]),
242244
('bip38_from_private_key', c_int, [c_void_p, c_size_t, c_void_p, c_size_t, c_uint32, c_char_p_p]),

src/wasm_package/src/functions.js

+4-2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/wasm_package/src/index.d.ts

+4-2
Original file line numberDiff line numberDiff line change
@@ -95,8 +95,8 @@ export function bip32_key_unserialize(bytes: Buffer|Uint8Array): Ref_ext_key;
9595
export function bip32_key_unserialize_noalloc(bytes: Buffer|Uint8Array, output: Ref_ext_key): void;
9696
export function bip32_key_with_tweak_from_parent_path(hdkey: Ref_ext_key, child_path: Uint32Array|number[], flags: number): Ref_ext_key;
9797
export function bip32_key_with_tweak_from_parent_path_noalloc(hdkey: Ref_ext_key, child_path: Uint32Array|number[], flags: number, output: Ref_ext_key): void;
98-
export function bip32_path_from_str(path_str: string, child_num: number, multi_index: number, flags: number, child_path_out_len: number): [child_path_out: number, written: number];
99-
export function bip32_path_from_str_n(path_str: string, path_str_len: number, child_num: number, multi_index: number, flags: number, child_path_out_len: number): [child_path_out: number, written: number];
98+
export function bip32_path_from_str_len(path_str: string, child_num: number, multi_index: number, flags: number): number;
99+
export function bip32_path_from_str_n_len(path_str: string, path_str_len: number, child_num: number, multi_index: number, flags: number): number;
100100
export function bip32_path_str_get_features(path_str: string): number;
101101
export function bip32_path_str_n_get_features(path_str: string, path_str_len: number): number;
102102
export function bip340_tagged_hash(bytes: Buffer|Uint8Array, tag: string): Buffer;
@@ -753,6 +753,8 @@ export function base58_n_to_bytes(str_in: string, str_len: number, flags: number
753753
export function base58_to_bytes(str_in: string, flags: number): Buffer;
754754
export function base64_n_to_bytes(str_in: string, str_len: number, flags: number): Buffer;
755755
export function base64_to_bytes(str_in: string, flags: number): Buffer;
756+
export function bip32_path_from_str(path_str: string, child_num: number, multi_index: number, flags: number): Uint32Array;
757+
export function bip32_path_from_str_n(path_str: string, path_str_len: number, child_num: number, multi_index: number, flags: number): Uint32Array;
756758
export function descriptor_get_key_child_path_str(descriptor: Ref_wally_descriptor, index: number): string;
757759
export function descriptor_get_key_origin_path_str(descriptor: Ref_wally_descriptor, index: number): string;
758760
export function descriptor_to_script(descriptor: Ref_wally_descriptor, depth: number, index: number, variant: number, multi_index: number, child_num: number, flags: number): Buffer;

tools/wasm_exports.sh

+2
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,9 @@ EXPORTED_FUNCTIONS="['_malloc','_free','_bip32_key_free' \
3737
,'_bip32_key_unserialize' \
3838
,'_bip32_key_unserialize_alloc' \
3939
,'_bip32_path_from_str' \
40+
,'_bip32_path_from_str_len' \
4041
,'_bip32_path_from_str_n' \
42+
,'_bip32_path_from_str_n_len' \
4143
,'_bip32_path_str_get_features' \
4244
,'_bip32_path_str_n_get_features' \
4345
,'_bip38_get_flags' \

0 commit comments

Comments
 (0)