///
/// This calculates the hash part in the tweak derivation process, which is used to
/// ensure that each key is unique and cannot be guessed by an external party.
- pub fn derive_add_tweak(&self, per_commitment_point: &PublicKey) -> [u8; 32] {
+ pub fn derive_add_tweak(&self, per_commitment_point: &PublicKey) -> Sha256 {
let mut sha = Sha256::engine();
sha.input(&per_commitment_point.serialize());
sha.input(&self.to_public_key().serialize());
- Sha256::from_engine(sha).to_byte_array()
+ Sha256::from_engine(sha)
}
}
let mut sha = Sha256::engine();
sha.input(&per_commitment_point.serialize());
sha.input(&base_point.serialize());
- let res = Sha256::from_engine(sha).to_byte_array();
+ let res = Sha256::from_engine(sha);
add_public_key_tweak(secp_ctx, base_point, &res)
}
/// Adds a tweak to a public key to derive a new public key.
+///
+/// May panic if `tweak` is not the output of a SHA-256 hash.
pub fn add_public_key_tweak<T: secp256k1::Signing>(
- secp_ctx: &Secp256k1<T>, base_point: &PublicKey, tweak: &[u8; 32],
+ secp_ctx: &Secp256k1<T>, base_point: &PublicKey, tweak: &Sha256,
) -> PublicKey {
let hashkey = PublicKey::from_secret_key(
&secp_ctx,
- &SecretKey::from_slice(tweak)
+ &SecretKey::from_slice(tweak.as_byte_array())
.expect("Hashes should always be valid keys unless SHA-256 is broken"),
);
base_point.combine(&hashkey)