From cfc1cb1aee0d7b5b4c02fc57f585f8af20be40f8 Mon Sep 17 00:00:00 2001 From: Trent Nelson Date: Tue, 27 Apr 2021 23:46:13 -0600 Subject: [PATCH] SDK: Factor out pubkey on-curve test to a helper --- sdk/program/src/pubkey.rs | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/sdk/program/src/pubkey.rs b/sdk/program/src/pubkey.rs index e088cc65fe..8718223bbc 100644 --- a/sdk/program/src/pubkey.rs +++ b/sdk/program/src/pubkey.rs @@ -109,6 +109,17 @@ impl TryFrom<&str> for Pubkey { } } +pub fn bytes_are_curve_point>(_bytes: T) -> bool { + #[cfg(not(target_arch = "bpf"))] + { + curve25519_dalek::edwards::CompressedEdwardsY::from_slice(_bytes.as_ref()) + .decompress() + .is_some() + } + #[cfg(target_arch = "bpf")] + unimplemented!(); +} + impl Pubkey { pub fn new(pubkey_vec: &[u8]) -> Self { Self( @@ -200,10 +211,7 @@ impl Pubkey { hasher.hashv(&[program_id.as_ref(), "ProgramDerivedAddress".as_ref()]); let hash = hasher.result(); - if curve25519_dalek::edwards::CompressedEdwardsY::from_slice(hash.as_ref()) - .decompress() - .is_some() - { + if bytes_are_curve_point(hash) { return Err(PubkeyError::InvalidSeeds); } @@ -324,6 +332,10 @@ impl Pubkey { self.0 } + pub fn is_on_curve(&self) -> bool { + bytes_are_curve_point(self) + } + /// Log a `Pubkey` from a program pub fn log(&self) { #[cfg(target_arch = "bpf")]