1use crate::message::{ParseError, ValidateError};
2use ed25519_dalek::{PublicKey, Signature};
3use serde::{Deserialize, Serialize};
4use thiserror::Error;
5
6#[derive(Serialize, Deserialize)]
7#[serde(rename_all = "camelCase")]
8pub struct SiwsOutput {
9 pub account: SolAccount,
10 pub signed_message: Vec<u8>,
11 pub signature: Vec<u8>,
12}
13
14#[derive(Serialize, Deserialize)]
15#[serde(rename_all = "camelCase")]
16pub struct SolAccount {
17 pub public_key: Vec<u8>,
18}
19
20impl SiwsOutput {
21 pub fn verify(&self) -> Result<bool, VerifyError> {
22 let pubkey = PublicKey::from_bytes(&self.account.public_key)
23 .map_err(|_| SiwsOutputError::InvalidPubkey)?;
24
25 let signature = Signature::from_bytes(&self.signature)
26 .map_err(|_| SiwsOutputError::InvalidSignature)?;
27
28 pubkey
30 .verify_strict(&self.signed_message, &signature)
31 .map_err(|_| VerifyError::VerificationFailure)?;
32
33 Ok(true)
34 }
35}
36
37#[derive(Error, Debug)]
38pub enum VerifyError {
39 #[error("Message Parse Error: {0}")]
40 MessageParse(#[from] ParseError),
41
42 #[error("Invalid Message: {0}")]
43 MessageValidate(#[from] ValidateError),
44
45 #[error("Signature Parse Error: {0}")]
46 SignatureParse(&'static str),
47
48 #[error("Solana Error: {0}")]
49 SiwsOutput(#[from] SiwsOutputError),
50
51 #[error("Signature verification failed")]
52 VerificationFailure,
53
54 #[error("")]
55 Infallible
56}
57
58#[derive(Debug, Error)]
59pub enum SiwsOutputError {
60 #[error("Invalid public key")]
61 InvalidPubkey,
62 #[error("Invalid signature")]
63 InvalidSignature,
64}