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 {
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")]