in akd/src/ecvrf/ecvrf_impl.rs [130:153]
fn try_from(bytes: &[u8]) -> std::result::Result<VRFPublicKey, Self::Error> {
if bytes.len() != ed25519_dalek::PUBLIC_KEY_LENGTH {
return Err(VrfError::PublicKey("Wrong length".to_string()));
}
let mut bits: [u8; 32] = [0u8; 32];
bits.copy_from_slice(&bytes[..32]);
let compressed = curve25519_dalek::edwards::CompressedEdwardsY(bits);
let point = compressed
.decompress()
.ok_or_else(|| VrfError::PublicKey("Deserialization failed".to_string()))?;
// Check if the point lies on a small subgroup. This is required
// when using curves with a small cofactor (in ed25519, cofactor = 8).
if point.is_small_order() {
return Err(VrfError::PublicKey("Small subgroup".to_string()));
}
match ed25519_PublicKey::from_bytes(bytes) {
Ok(result) => Ok(VRFPublicKey(result)),
Err(sig_err) => Err(VrfError::PublicKey(format!("Signature error {}", sig_err))),
}
}