From fe688ada65b6b4a40ed0740b6f4cbe688c044473 Mon Sep 17 00:00:00 2001 From: Elichai Turkel Date: Wed, 27 Nov 2019 17:36:06 +0200 Subject: [PATCH] Make the Context trait unimplementable --- src/context.rs | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/context.rs b/src/context.rs index e8eba5d..583b5f9 100644 --- a/src/context.rs +++ b/src/context.rs @@ -8,8 +8,8 @@ use Secp256k1; pub use self::std_only::*; /// A trait for all kinds of Context's that Lets you define the exact flags and a function to deallocate memory. -/// * DO NOT * implement it for your own types. -pub unsafe trait Context { +/// It shouldn't be possible to implement this for types outside this crate. +pub unsafe trait Context : private::Sealed { /// Flags for the ffi. const FLAGS: c_uint; /// A constant description of the context. @@ -39,8 +39,24 @@ pub struct AllPreallocated<'buf> { phantom: PhantomData<&'buf ()>, } +mod private { + use super::*; + // A trick to prevent users from implementing a trait. + // on one hand this trait is public, on the other it's in a private module + // so it's not visible to anyone besides it's parent (the context module) + pub trait Sealed {} + + impl<'buf> Sealed for AllPreallocated<'buf> {} + impl<'buf> Sealed for VerifyOnlyPreallocated<'buf> {} + impl<'buf> Sealed for SignOnlyPreallocated<'buf> {} +} + #[cfg(feature = "std")] mod std_only { + impl private::Sealed for SignOnly {} + impl private::Sealed for All {} + impl private::Sealed for VerifyOnly {} + use super::*; /// Represents the set of capabilities needed for signing.