-
Notifications
You must be signed in to change notification settings - Fork 411
Remove cryptographically unreachable error conditions #1887
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Remove cryptographically unreachable error conditions #1887
Conversation
The `derive_{public,private}_key` methods hash the two input keys and then add them to the input public key. Because addition can fail if the tweak is the inverse of the secret key this method currently returns a `Result`. However, it is not cryptographically possible to reach the error case - in order to create an issue, the SHA-256 hash of the `base_point` (and other data) must be the inverse of the `base_point`('s secret key). Because changing the `base_point` changes the hash in an unpredictable way, there should be no way to construct such a `base_point`.
The `derive_{public,private}_revocation_key` methods hash the two input keys and then multiply the two input keys by hashed values before adding them together. Because addition can fail if the tweak is the inverse of the secret key this method currently returns a `Result`. However, it is not cryptographically possible to reach the error case - in order to create an issue, the point-multiplied-by-hash values must be the inverse of each other, however each point commits the SHA-256 hash of both keys together. Thus, because changing either key changes the hashes (and the ultimate points added together) in an unpredictable way, there should be no way to construct such points.
/// Note that this is infallible iff we trust that at least one of the two input keys are randomly | ||
/// generated (ie our own). | ||
pub fn derive_private_key<T: secp256k1::Signing>(secp_ctx: &Secp256k1<T>, per_commitment_point: &PublicKey, base_secret: &SecretKey) -> Result<SecretKey, SecpError> { | ||
pub fn derive_private_key<T: secp256k1::Signing>(secp_ctx: &Secp256k1<T>, per_commitment_point: &PublicKey, base_secret: &SecretKey) -> SecretKey { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Reviewed this change (and the 3 following it) and confirmed that all the .expect
s are actually for cryptographically unreachable branches.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nice, this will help clean up some return parameters in #1825.
Looks good and seems safe to me. Not a lawyer though. |
No description provided.