catzconnect 1.0.0

Secure, minimal SDK for sending encrypted communication requests to the CatzConnect API
Documentation

CatzConnect SDK (Rust)

A secure, minimal SDK for sending encrypted communication requests (e.g., email OTP) to the CatzConnect API.


✨ Features

  • 🔐 End-to-end payload encryption (X25519 ECDH + BLAKE2b-256 + ChaCha20-Poly1305 IETF)
  • ⚡ Stateless design — no init() required
  • 🧠 Automatic payload validation
  • 🔑 API key via environment variable (Bearer token)
  • 🦀 Pure Rust — no libsodium C dependency

📦 Installation

Add to your Cargo.toml:

[dependencies]
catzconnect = "1.0.0"
tokio   = { version = "1", features = ["full"] }
dotenvy = "0.15"

⚙️ Environment Setup

Create a .env file (or export these variables):

API_KEY=your_api_key
PRIVATE_KEY=your_base64_private_key
SERVER_PUBLIC_KEY=server_base64_public_key
# BASE_URL=https://api.catzconnect.com  # optional

⚠️ Never expose these values in public environments.


🚀 Usage

use catzconnect::{
    CatzConnect,
    types::{Channel, MessageType, SendInput, SendPayload, Template},
};

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    dotenvy::dotenv().ok(); // load .env

    let response = CatzConnect::send(SendInput {
        message_type: MessageType::Verification,
        channel:      Channel::Email,
        template:     Template::Otp,
        payload: SendPayload {
            to:  Some("user@example.com".into()),
            otp: Some(123456),
        },
    })
    .await?;

    println!("{response}");
    Ok(())
}

📬 Supported Operation

Email Verification OTP

SendInput {
    message_type: MessageType::Verification,
    channel:      Channel::Email,
    template:     Template::Otp,
    payload: SendPayload {
        to:  Some("user@example.com".into()), // required, valid email
        otp: Some(123456),                    // required
    },
}

🔐 How It Works

  1. Validate Input — ensures required fields are present and the email is valid
  2. Encrypt Payload
    • X25519 ECDH shared secret: scalarmult(client_priv, server_pub)
    • master = BLAKE2b-256(shared)
    • key_enc = BLAKE2b-256(master || "CONNECT-@-2026-HS-@-CATZ")
    • ChaCha20-Poly1305 IETF encrypt with a random 12-byte nonce
  3. Send RequestPOST /sdk/send with { nonce, ciphertext } JSON and Authorization: Bearer <key>

❌ Error Handling

match CatzConnect::send(input).await {
    Ok(resp)  => println!("Success: {resp}"),
    Err(e)    => eprintln!("Error: {e}"),
}

All errors implement std::error::Error via thiserror.


🧩 Example Response

{ "status": "success", "request_id": "abc123" }

🛠 Development

cargo build
cargo test
cargo clippy