You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Merge #765: Fix how descriptor checksums are calculated
648282e Update docs and tests based on review comments (Steve Myers)
60057a7 Deprecate backward compatible get_checksum_bytes, get_checksum functions (Steve Myers)
e2a4a58 Ensure backward compatibility of the "checksum inception" bug (志宇)
fd34956 `get_checksum_bytes` now checks input data for checksum (志宇)
Pull request description:
### Description
Previously, the methods `get_checksum_bytes` and `get_checksum` do not check input data to see whether the input data already has a checksum.
This PR does the following:
* Introduce a `exclude_hash: bool` flag for `get_checksum_bytes`, that excludes the checksum portion of the original data when calculating the checksum. In addition to this, if the calculated checksum does not match the original checksum, an error is returned for extra safety.
* Ensure `Wallet` is still backwards compatible with databases created with the "checksum inception" bug.
### Notes to the reviewers
Thank you.
### Changelog notice
Fix the "checksum inception" bug, where we may accidentally calculate the checksum of a descriptor that already has a checksum.
### Checklists
#### All Submissions:
* [x] I've signed all my commits
* [x] I followed the [contribution guidelines](https://github.com/bitcoindevkit/bdk/blob/master/CONTRIBUTING.md)
* [x] I ran `cargo fmt` and `cargo clippy` before committing
#### Bugfixes:
* [x] This pull request breaks the existing API
* [x] I've added tests to reproduce the issue which are now passing
~* [ ] I'm linking the issue being fixed by this PR~
Top commit has no ACKs.
Tree-SHA512: 7ea2721dcd56459b6996e56a3ddfc3559a0c64869a08f5312a8f0f4fcb5dbef7ac7461a4ab017acde4a62fed02d8a620c402dd384323aba85736610514fcb7e1
// TODO in release 0.25.0, remove get_checksum_bytes and get_checksum
110
+
// TODO in release 0.25.0, consolidate calc_checksum_bytes_internal into calc_checksum_bytes
111
+
112
+
/// Compute the checksum bytes of a descriptor
113
+
#[deprecated(
114
+
since = "0.24.0",
115
+
note = "Use new `calc_checksum_bytes` function which excludes any existing checksum in the descriptor string before calculating the checksum hash bytes. See https://github.com/bitcoindevkit/bdk/pull/765."
note = "Use new `calc_checksum` function which excludes any existing checksum in the descriptor string before calculating the checksum hash. See https://github.com/bitcoindevkit/bdk/pull/765."
let desc = "pkh(tpubD6NzVbkrYhZ4XHndKkuB8FifXm8r5FQHwrN6oZuWCz13qb93rtgKvD4PQsqC4HP4yhV3tA2fqr2RbY5mNXfM7RxXUoeABoDtsFUq2zJq6YK/44'/1'/0'/0/*)#lasegmfs";
let desc = "wpkh(tprv8ZgxMBicQKsPdpkqS7Eair4YxjcuuvDPNYmKX3sCniCf16tHEVrjjiSXEkFRnUH77yXc6ZcwHHcLNfjdi5qUvw3VDfgYiH5mNsj5izuiu2N/1/2/*)#tqz0nc26";
158
+
assert!(matches!(
159
+
calc_checksum(desc).err(),
160
+
Some(DescriptorError::InvalidDescriptorChecksum)
161
+
));
162
+
163
+
let desc = "pkh(tpubD6NzVbkrYhZ4XHndKkuB8FifXm8r5FQHwrN6oZuWCz13qb93rtgKvD4PQsqC4HP4yhV3tA2fqr2RbY5mNXfM7RxXUoeABoDtsFUq2zJq6YK/44'/1'/0'/0/*)#lasegmsf";
164
+
assert!(matches!(
165
+
calc_checksum(desc).err(),
166
+
Some(DescriptorError::InvalidDescriptorChecksum)
167
+
));
97
168
}
98
169
99
170
#[test]
100
-
fntest_get_checksum_invalid_character(){
171
+
fntest_calc_checksum_invalid_character(){
101
172
let sparkle_heart = unsafe{ std::str::from_utf8_unchecked(&[240,159,146,150])};
102
173
let invalid_desc = format!("wpkh(tprv8ZgxMBicQKsPdpkqS7Eair4YxjcuuvDPNYmKX3sCniCf16tHEVrjjiSXEkFRnUH77yXc6ZcwHHcL{}fjdi5qUvw3VDfgYiH5mNsj5izuiu2N/1/2/*)", sparkle_heart);
0 commit comments