Skip to content

Commit 4428361

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

1 file changed

Lines changed: 7 additions & 10 deletions

File tree

src/pset/serialize.rs

Lines changed: 7 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,17 @@ 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 (prefix, mut rest) = match SliceExt::split_first_chunk::<4>(bytes) {
180+
Some(v) => v,
181+
None => return Err(io::Error::from(io::ErrorKind::UnexpectedEof).into()),
182182
};
183183

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

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-
}
187+
while !rest.is_empty() {
188+
let index = u32::consensus_decode(&mut rest)?;
189+
dpath.push(index.into());
193190
}
194191

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

0 commit comments

Comments
 (0)