ecash-core 0.1.0

RSA-3072 blind signature protocol for anonymous digital cash
Documentation
use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};

#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct Token {
    pub serial_number: Vec<u8>,
    pub denomination: u64,
    pub currency: String,
    pub signature: Vec<u8>,
    pub issued_at: DateTime<Utc>,
    pub expires_at: DateTime<Utc>,
    pub institution_id: String,
    pub key_id: String,
}

impl Token {
    pub fn new(
        serial_number: Vec<u8>,
        denomination: u64,
        currency: String,
        signature: Vec<u8>,
        expires_at: DateTime<Utc>,
        institution_id: String,
        key_id: String,
    ) -> Self {
        Self {
            serial_number,
            denomination,
            currency,
            signature,
            issued_at: Utc::now(),
            expires_at,
            institution_id,
            key_id,
        }
    }

    pub fn is_expired(&self) -> bool {
        Utc::now() > self.expires_at
    }

    pub fn serial_hex(&self) -> String {
        hex::encode(&self.serial_number)
    }
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BlindedToken {
    pub blinded_message: Vec<u8>,
    pub denomination: u64,
    pub currency: String,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BlindSignature {
    pub signature: Vec<u8>,
    pub key_id: String,
}

#[derive(Debug, Clone)]
pub struct TokenMetadata {
    pub serial_number: Vec<u8>,
    pub blinding_factor: Vec<u8>,
    pub denomination: u64,
    pub currency: String,
}