contracthash: more cleanups

This commit is contained in:
Andrew Poelstra 2019-03-19 18:25:24 +00:00
parent 01a3a9263c
commit dc6189dbb2
1 changed files with 12 additions and 11 deletions

View File

@ -160,15 +160,16 @@ impl<'a> From<&'a [u8]> for Template {
} }
} }
/// Tweak keys using some arbitrary data /// Tweak a single key using some arbitrary data
pub fn tweak_keys<C: secp256k1::Verification>(secp: &Secp256k1<C>, keys: &[PublicKey], contract: &[u8]) -> Result<Vec<PublicKey>, Error> { pub fn tweak_key<C: secp256k1::Verification>(secp: &Secp256k1<C>, mut key: PublicKey, contract: &[u8]) -> PublicKey {
let mut ret = Vec::with_capacity(keys.len());
for mut key in keys.iter().cloned() {
let hmac_result = compute_tweak(&key, contract); let hmac_result = compute_tweak(&key, contract);
key.key.add_exp_assign(secp, &hmac_result[..]).map_err(Error::Secp)?; key.key.add_exp_assign(secp, &hmac_result[..]).expect("HMAC cannot produce invalid tweak");
ret.push(key); key
} }
Ok(ret)
/// Tweak keys using some arbitrary data
pub fn tweak_keys<C: secp256k1::Verification>(secp: &Secp256k1<C>, keys: &[PublicKey], contract: &[u8]) -> Vec<PublicKey> {
keys.iter().cloned().map(|key| tweak_key(secp, key, contract)).collect()
} }
/// Compute a tweak from some given data for the given public key /// Compute a tweak from some given data for the given public key
@ -202,7 +203,7 @@ pub fn create_address<C: secp256k1::Verification>(secp: &Secp256k1<C>,
keys: &[PublicKey], keys: &[PublicKey],
template: &Template) template: &Template)
-> Result<address::Address, Error> { -> Result<address::Address, Error> {
let keys = tweak_keys(secp, keys, contract)?; let keys = tweak_keys(secp, keys, contract);
let script = template.to_script(&keys)?; let script = template.to_script(&keys)?;
Ok(address::Address { Ok(address::Address {
network: network, network: network,
@ -358,7 +359,7 @@ mod tests {
let contract = b"if bottle mt dont remembr drink wont pay"; let contract = b"if bottle mt dont remembr drink wont pay";
// Directly compute tweaks on pubkeys // 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 // Compute tweaks on secret keys
let tweaked_pk1 = PublicKey::from_private_key(&secp, &tweak_secret_key(&secp, &sk1, &contract[..]).unwrap()); 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()); 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 // Directly compute tweaks on pubkeys
assert_eq!( assert_eq!(
tweak_keys(&secp, &pks, &contract[..]).unwrap(), tweak_keys(&secp, &pks, &contract[..]),
tweaked_pks tweaked_pks
); );
} }