Skip to content

Commit 5e0d577

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

1 file changed

Lines changed: 4 additions & 5 deletions

File tree

src/pset/serialize.rs

Lines changed: 4 additions & 5 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};
@@ -29,6 +28,7 @@ use crate::{AssetId, BlockHash, Script, Transaction, TxOut, Txid};
2928
use bitcoin;
3029
use bitcoin::bip32::{ChildNumber, Fingerprint, KeySource};
3130
use bitcoin::{key::XOnlyPublicKey, PublicKey};
31+
use internals::slice::SliceExt;
3232
use secp256k1_zkp::{self, RangeProof, SurjectionProof, Tweak};
3333

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

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

183183
let fprint: Fingerprint = Fingerprint::from(prefix);
184184
let mut dpath: Vec<ChildNumber> = Vec::default();
185185

186-
let mut d = &bytes[4..];
187-
while !d.is_empty() {
188-
let index = u32::consensus_decode(&mut d)?;
186+
while !rest.is_empty() {
187+
let index = u32::consensus_decode(&mut rest)?;
189188
dpath.push(index.into());
190189
}
191190

0 commit comments

Comments
 (0)