SDK: Factor out pubkey on-curve test to a helper (#16935)
(cherry picked from commit cfc1cb1aee
)
Co-authored-by: Trent Nelson <trent@solana.com>
This commit is contained in:
@ -108,6 +108,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(
|
||||
@ -199,10 +210,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);
|
||||
}
|
||||
|
||||
@ -323,6 +331,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")]
|
||||
|
Reference in New Issue
Block a user