From 4a0c7fca6a3a93e66e6ba87a376db3bf04fa9bbd Mon Sep 17 00:00:00 2001 From: "Tobin C. Harding" Date: Tue, 22 Nov 2022 09:39:27 +1100 Subject: [PATCH] Do not use impl_array_newtype for SecretKey In preparation for changing the logic of comparison trait (Ord, Eq) implementations on the `SecretKey` copy all the code out of `impl_array_newtype` and implement it directly in `key.rs`. Refactor only, no logic changes (although I removed a few unneeded references). --- src/key.rs | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 64 insertions(+), 3 deletions(-) diff --git a/src/key.rs b/src/key.rs index 3cf6111..d480e00 100644 --- a/src/key.rs +++ b/src/key.rs @@ -17,7 +17,7 @@ //! use core::convert::TryFrom; -use core::ops::BitXor; +use core::ops::{self, BitXor}; use core::{fmt, ptr, str}; #[cfg(feature = "serde")] @@ -28,7 +28,7 @@ use crate::ffi::{self, CPtr}; #[cfg(all(feature = "global-context", feature = "rand-std"))] use crate::schnorr; use crate::Error::{self, InvalidPublicKey, InvalidPublicKeySum, InvalidSecretKey}; -use crate::{constants, from_hex, impl_array_newtype, Scalar, Secp256k1, Signing, Verification}; +use crate::{constants, from_hex, Scalar, Secp256k1, Signing, Verification}; #[cfg(feature = "global-context")] use crate::{ecdsa, Message, SECP256K1}; #[cfg(feature = "bitcoin-hashes")] @@ -58,9 +58,70 @@ use crate::{hashes, ThirtyTwoByteHash}; /// [`cbor`]: https://docs.rs/cbor #[derive(Copy, Clone)] pub struct SecretKey([u8; constants::SECRET_KEY_SIZE]); -impl_array_newtype!(SecretKey, u8, constants::SECRET_KEY_SIZE); impl_display_secret!(SecretKey); +impl PartialEq for SecretKey { + #[inline] + fn eq(&self, other: &Self) -> bool { + self[..] == other[..] + } +} + +impl Eq for SecretKey {} + +impl core::hash::Hash for SecretKey { + fn hash(&self, state: &mut H) { + self[..].hash(state) + } +} + +impl PartialOrd for SecretKey { + #[inline] + fn partial_cmp(&self, other: &SecretKey) -> Option { + self[..].partial_cmp(&other[..]) + } +} + +impl Ord for SecretKey { + #[inline] + fn cmp(&self, other: &SecretKey) -> core::cmp::Ordering { + self[..].cmp(&other[..]) + } +} + +impl AsRef<[u8; constants::SECRET_KEY_SIZE]> for SecretKey { + /// Gets a reference to the underlying array + #[inline] + fn as_ref(&self) -> &[u8; constants::SECRET_KEY_SIZE] { + let &SecretKey(ref dat) = self; + dat + } +} + +impl ops::Index for SecretKey +where + [u8]: ops::Index, +{ + type Output = <[u8] as ops::Index>::Output; + + #[inline] + fn index(&self, index: I) -> &Self::Output { &self.0[index] } +} + +impl ffi::CPtr for SecretKey { + type Target = u8; + + fn as_c_ptr(&self) -> *const Self::Target { + let &SecretKey(ref dat) = self; + dat.as_ptr() + } + + fn as_mut_c_ptr(&mut self) -> *mut Self::Target { + let &mut SecretKey(ref mut dat) = self; + dat.as_mut_ptr() + } +} + impl str::FromStr for SecretKey { type Err = Error; fn from_str(s: &str) -> Result {