From dc6189dbb24c695d1e946ff2f8b6f0349cc0e47e Mon Sep 17 00:00:00 2001 From: Andrew Poelstra Date: Tue, 19 Mar 2019 18:25:24 +0000 Subject: [PATCH] contracthash: more cleanups --- src/util/contracthash.rs | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/src/util/contracthash.rs b/src/util/contracthash.rs index fdce554..33fa3ef 100644 --- a/src/util/contracthash.rs +++ b/src/util/contracthash.rs @@ -160,15 +160,16 @@ impl<'a> From<&'a [u8]> for Template { } } +/// Tweak a single key using some arbitrary data +pub fn tweak_key(secp: &Secp256k1, mut key: PublicKey, contract: &[u8]) -> PublicKey { + let hmac_result = compute_tweak(&key, contract); + key.key.add_exp_assign(secp, &hmac_result[..]).expect("HMAC cannot produce invalid tweak"); + key +} + /// Tweak keys using some arbitrary data -pub fn tweak_keys(secp: &Secp256k1, keys: &[PublicKey], contract: &[u8]) -> Result, Error> { - let mut ret = Vec::with_capacity(keys.len()); - for mut key in keys.iter().cloned() { - let hmac_result = compute_tweak(&key, contract); - key.key.add_exp_assign(secp, &hmac_result[..]).map_err(Error::Secp)?; - ret.push(key); - } - Ok(ret) +pub fn tweak_keys(secp: &Secp256k1, keys: &[PublicKey], contract: &[u8]) -> Vec { + keys.iter().cloned().map(|key| tweak_key(secp, key, contract)).collect() } /// Compute a tweak from some given data for the given public key @@ -202,7 +203,7 @@ pub fn create_address(secp: &Secp256k1, keys: &[PublicKey], template: &Template) -> Result { - let keys = tweak_keys(secp, keys, contract)?; + let keys = tweak_keys(secp, keys, contract); let script = template.to_script(&keys)?; Ok(address::Address { network: network, @@ -358,7 +359,7 @@ mod tests { let contract = b"if bottle mt dont remembr drink wont pay"; // Directly compute tweaks on pubkeys - let tweaked_pks = tweak_keys(&secp, &pks, &contract[..]).unwrap(); + let tweaked_pks = tweak_keys(&secp, &pks, &contract[..]); // Compute tweaks on secret keys let tweaked_pk1 = PublicKey::from_private_key(&secp, &tweak_secret_key(&secp, &sk1, &contract[..]).unwrap()); let tweaked_pk2 = PublicKey::from_private_key(&secp, &tweak_secret_key(&secp, &sk2, &contract[..]).unwrap()); @@ -387,7 +388,7 @@ mod tests { // Directly compute tweaks on pubkeys assert_eq!( - tweak_keys(&secp, &pks, &contract[..]).unwrap(), + tweak_keys(&secp, &pks, &contract[..]), tweaked_pks ); }