Skip to content

Commit c96fb88

Browse files
committed
pset: fix slicing in KeySource::deserialize
Lol, this code was so close and yet so far.
1 parent d36df59 commit c96fb88

1 file changed

Lines changed: 6 additions & 10 deletions

File tree

src/pset/serialize.rs

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
//! Defines traits used for (de)serializing PSET values into/from raw
1818
//! bytes in PSET key-value pairs.
1919
20-
use std::convert::TryFrom;
2120
use std::io;
2221

2322
use crate::confidential::{self, AssetBlindingFactor};
@@ -30,6 +29,7 @@ use crate::{AssetId, BlockHash, Script, Transaction, TxOut, Txid};
3029
use bitcoin;
3130
use bitcoin::bip32::{ChildNumber, Fingerprint, KeySource};
3231
use bitcoin::{key::XOnlyPublicKey, PublicKey};
32+
use crate::internals::slice::SliceExt;
3333
use secp256k1_zkp::{self, RangeProof, SurjectionProof, Tweak};
3434

3535
use super::map::{PsbtSighashType, TapTree};
@@ -176,20 +176,16 @@ impl Serialize for KeySource {
176176

177177
impl Deserialize for KeySource {
178178
fn deserialize(bytes: &[u8]) -> Result<Self, encode::Error> {
179-
let prefix = match <[u8; 4]>::try_from(&bytes[0..4]) {
180-
Ok(prefix) => prefix,
181-
Err(_) => return Err(io::Error::from(io::ErrorKind::UnexpectedEof).into()),
179+
let Some((prefix, mut rest)) = SliceExt::split_first_chunk::<4>(bytes) else {
180+
return Err(io::Error::from(io::ErrorKind::UnexpectedEof).into());
182181
};
183182

184183
let fprint: Fingerprint = Fingerprint::from(prefix);
185184
let mut dpath: Vec<ChildNumber> = Vec::default();
186185

187-
let mut d = &bytes[4..];
188-
while !d.is_empty() {
189-
match u32::consensus_decode(&mut d) {
190-
Ok(index) => dpath.push(index.into()),
191-
Err(e) => return Err(e),
192-
}
186+
while !rest.is_empty() {
187+
let index = u32::consensus_decode(&mut rest)?;
188+
dpath.push(index.into());
193189
}
194190

195191
Ok((fprint, dpath.into()))

0 commit comments

Comments
 (0)