use ed25519_dalek::Verifier;
use ed25519_dalek::{PublicKey, Signature};
pub enum ValidationError {
KeyConversionError {
name: &'static str,
},
InvalidSignatureError,
}
pub fn verify_discord_message(
public_key: PublicKey,
signature: &str,
timestamp: &str,
body: &str,
) -> Result<(), ValidationError> {
let signature_bytes = hex::decode(signature)
.map_err(|_| ValidationError::KeyConversionError { name: "Signature" })?;
let signature = Signature::from_bytes(signature_bytes.as_slice()).map_err(|_| {
ValidationError::KeyConversionError {
name: "From bytes conversion error",
}
})?;
let msg = format!("{}{}", timestamp, body);
public_key
.verify(msg.as_bytes(), &signature)
.map_err(|_| ValidationError::InvalidSignatureError)
}