SDK: Factor out pubkey on-curve test to a helper

This commit is contained in:
Trent Nelson
2021-04-27 23:46:13 -06:00
committed by Trent Nelson
parent a7070a5ca7
commit cfc1cb1aee

View File

@ -109,6 +109,17 @@ impl TryFrom<&str> for Pubkey {
} }
} }
pub fn bytes_are_curve_point<T: AsRef<[u8]>>(_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 { impl Pubkey {
pub fn new(pubkey_vec: &[u8]) -> Self { pub fn new(pubkey_vec: &[u8]) -> Self {
Self( Self(
@ -200,10 +211,7 @@ impl Pubkey {
hasher.hashv(&[program_id.as_ref(), "ProgramDerivedAddress".as_ref()]); hasher.hashv(&[program_id.as_ref(), "ProgramDerivedAddress".as_ref()]);
let hash = hasher.result(); let hash = hasher.result();
if curve25519_dalek::edwards::CompressedEdwardsY::from_slice(hash.as_ref()) if bytes_are_curve_point(hash) {
.decompress()
.is_some()
{
return Err(PubkeyError::InvalidSeeds); return Err(PubkeyError::InvalidSeeds);
} }
@ -324,6 +332,10 @@ impl Pubkey {
self.0 self.0
} }
pub fn is_on_curve(&self) -> bool {
bytes_are_curve_point(self)
}
/// Log a `Pubkey` from a program /// Log a `Pubkey` from a program
pub fn log(&self) { pub fn log(&self) {
#[cfg(target_arch = "bpf")] #[cfg(target_arch = "bpf")]