siws/
output.rs

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        // Verify signature
29        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}