Skip to content

Commit

Permalink
Merge #66: elip150: handle x-only pubkeys
Browse files Browse the repository at this point in the history
e6d6028 elip150: handle x-only pubkeys (Leonardo Comandini)

Pull request description:

  In ELIP150, descriptor blinding keys cannot be x-only pubkeys. Thus if we have a 64 hex char descriptor blinding key, we need to interpret is as a single view descriptor blinding key.

ACKs for top commit:
  RCasatta:
    utACK e6d6028
  apoelstra:
    ACK e6d6028

Tree-SHA512: dd95fdfcefa2e1739f54edc4f4bd10459f40bf50e25465219cf17b6ef44803aca34a6c6cf0cbe732f67bc9cdf2b8cfc6c95a03b2e843ad13bc99379e33305526
  • Loading branch information
apoelstra committed Jan 2, 2024
2 parents 9dcc34a + e6d6028 commit 353005c
Showing 1 changed file with 16 additions and 3 deletions.
19 changes: 16 additions & 3 deletions src/confidential/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -220,8 +220,8 @@ impl_from_str!(
("slip77", _) => return Err(Error::BadDescriptor(
"slip77() must have exactly one argument".to_owned()
)),
_ => expression::terminal(keyexpr, DescriptorPublicKey::from_str).map(Key::Bare)
.or_else(|_| expression::terminal(keyexpr, |s: &str| DescriptorSecretKey::from_str_inner(s, true)).map(Key::View))?,
_ => expression::terminal(keyexpr, |s: &str| DescriptorSecretKey::from_str_inner(s, true)).map(Key::View)
.or_else(|_| expression::terminal(keyexpr, DescriptorPublicKey::from_str).map(Key::Bare))?,
},
descriptor: crate::Descriptor::from_tree(&top.args[1])?,
})
Expand Down Expand Up @@ -432,7 +432,7 @@ mod tests {
),
(
"ct(L3jXxwef3fpB7hcrFozcWgHeJCPSAFiZ1Ji2YJMPxceaGvy3PC1q,elwpkh(03774eec7a3d550d18e9f89414152025b3b0ad6a342b19481f702d843cff06dfc4))#gcy6hcfz",
"unexpected «Error while parsing xkey.»",
"unexpected «Key too short (<66 char), doesn't match any format»",
),
];

Expand Down Expand Up @@ -504,6 +504,19 @@ mod tests {
}
}

#[test]
fn view_xonly_pubkey_descriptor() {
// View keys are 64 hex chars, but also x-only public keys are 64 hex chars
let view_key = "ab16855a17319477d4283fe5c29cc7d047f81e8ffb199e20d9be1bc31a751c4c";
// This view key can also be interpreted as a public key
let _public_key = DescriptorPublicKey::from_str(view_key).unwrap();
// But since compressed public keys are disallowed, it must be interpreted as a view key
let pk = "021a8fb6bd5a653b021b98a2a785725b8ddacfe3687bc043aa7f4d25d3a48d40b5";
let desc_str = format!("ct({view_key},elwpkh({pk}))#n9uc7tzt");
let desc = Descriptor::<DefiniteDescriptorKey>::from_str(&desc_str).unwrap();
assert!(matches!(desc.key, Key::View(_)));
}

#[test]
fn descriptor_wildcard() {
let secp = secp256k1_zkp::Secp256k1::new();
Expand Down

0 comments on commit 353005c

Please sign in to comment.