mirror of
https://github.com/jwinterm/grin-wallet.git
synced 2026-10-17 15:21:39 +02:00
Harden v5 payment-proof deserialization against malformed input
ProofWrap::read unwrapped on the sender/receiver address, promise signature, and memo_type while parsing untrusted slatepack bytes, so a malformed payment proof would panic the wallet. Propagate CorruptedData instead, matching the timestamp path already in this function.
This commit is contained in:
@@ -245,8 +245,10 @@ impl<'a> Writeable for ProofWrapRef<'a> {
|
|||||||
|
|
||||||
impl Readable for ProofWrap {
|
impl Readable for ProofWrap {
|
||||||
fn read<R: Reader>(reader: &mut R) -> Result<ProofWrap, grin_ser::Error> {
|
fn read<R: Reader>(reader: &mut R) -> Result<ProofWrap, grin_ser::Error> {
|
||||||
let saddr = DalekPublicKey::from_bytes(&reader.read_fixed_bytes(32)?).unwrap();
|
let saddr = DalekPublicKey::from_bytes(&reader.read_fixed_bytes(32)?)
|
||||||
let raddr = DalekPublicKey::from_bytes(&reader.read_fixed_bytes(32)?).unwrap();
|
.map_err(|_| grin_ser::Error::CorruptedData)?;
|
||||||
|
let raddr = DalekPublicKey::from_bytes(&reader.read_fixed_bytes(32)?)
|
||||||
|
.map_err(|_| grin_ser::Error::CorruptedData)?;
|
||||||
let ts_raw: i64 = match reader.read_i64() {
|
let ts_raw: i64 = match reader.read_i64() {
|
||||||
Ok(v) => v,
|
Ok(v) => v,
|
||||||
Err(_) => return Err(grin_ser::Error::CorruptedData),
|
Err(_) => return Err(grin_ser::Error::CorruptedData),
|
||||||
@@ -258,12 +260,15 @@ impl Readable for ProofWrap {
|
|||||||
let ts = DateTime::<Utc>::from_utc(ts_opt, Utc);
|
let ts = DateTime::<Utc>::from_utc(ts_opt, Utc);
|
||||||
let psig = match reader.read_u8()? {
|
let psig = match reader.read_u8()? {
|
||||||
0 => None,
|
0 => None,
|
||||||
1 | _ => Some(DalekSignature::try_from(&reader.read_fixed_bytes(64)?[..]).unwrap()),
|
1 | _ => Some(
|
||||||
|
DalekSignature::try_from(&reader.read_fixed_bytes(64)?[..])
|
||||||
|
.map_err(|_| grin_ser::Error::CorruptedData)?,
|
||||||
|
),
|
||||||
};
|
};
|
||||||
let memo = match reader.read_u8()? {
|
let memo = match reader.read_u8()? {
|
||||||
0 => None,
|
0 => None,
|
||||||
1 | _ => Some(PaymentMemoV5 {
|
1 | _ => Some(PaymentMemoV5 {
|
||||||
memo_type: reader.read_u8().unwrap(),
|
memo_type: reader.read_u8()?,
|
||||||
memo: reader.read_fixed_bytes(32)?.try_into().unwrap_or_default(),
|
memo: reader.read_fixed_bytes(32)?.try_into().unwrap_or_default(),
|
||||||
}),
|
}),
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user