Crates.io | xaeroid |
lib.rs | xaeroid |
version | 0.4.1 |
created_at | 2025-06-11 05:37:13.537618+00 |
updated_at | 2025-07-09 17:21:27.554939+00 |
description | A cloudless, decentralized DID key generator and identity verification system using Rust. |
homepage | |
repository | https://github.com/block-xaero/xaeroid |
max_upload_size | |
id | 1708157 |
size | 199,217 |
A zero-knowledge proof wallet system with decentralized identity (DID) built on Falcon-512 post-quantum cryptography.
XaeroID provides a complete framework for managing decentralized identities, verifiable credentials, and zero-knowledge proofs in a Pod-safe, portable format that works both standalone and as part of larger systems.
bytemuck
use xaeroid::{XaeroIdentityManager, IdentityManager};
// Create a new identity manager
let manager = XaeroIdentityManager {};
// Generate a new DID with embedded Falcon-512 keypair
let identity = manager.new_id();
// Get the DID string
let did = format!("did:peer:{}",
multibase::encode(multibase::Base::Base58Btc, &identity.did_peer));
println!("New identity: {}", did);
use xaeroid::domain::xaero_wallet::{XaeroWallet, WalletProofType};
use ark_bn254::Fr;
// Create a wallet from identity
let mut wallet = XaeroWallet::new(identity);
// Prove membership in a group
let group_id = Fr::from(42u64);
let token_randomness = Fr::from(12345u64);
wallet.prove_and_store_membership(group_id, token_randomness)
.expect("Membership proof failed");
// Prove role authority
wallet.prove_and_store_role(5, 3) // My role: 5, Required: 3
.expect("Role proof failed");
// Sign challenges
let challenge = b"authenticate me";
let signature = wallet.sign_challenge(challenge);
assert!(wallet.verify_challenge(challenge, &signature));
use xaeroid::{FalconCredentialIssuer, CredentialIssuer};
// Create issuer with its own identity
let issuer_identity = manager.new_id();
let issuer = FalconCredentialIssuer {
issuer_xid: issuer_identity
};
// Issue a credential
let credential = issuer.issue_credential(
"did:peer:example",
"alice@example.com".to_string(),
1990
);
// Verify the credential
assert!(issuer.verify_credential(&credential));
XaeroID supports optional event emission for integration with event streaming systems:
use xaeroid::domain::xaero_wallet::{WalletEventSink, BlackholeEventSink};
// Use blackhole sink for standalone operation (no events)
let sink = BlackholeEventSink;
// Prove membership with event emission
wallet.prove_and_store_membership_with_sink(
group_id,
token_randomness,
Some(&sink)
).expect("Proof with events failed");
// Implement custom event sink for your system
struct MyEventSink;
impl WalletEventSink for MyEventSink {
fn emit_wallet_event(&self, wallet_id: &str, op: WalletCrdtOp) -> Result<(), Box<dyn std::error::Error>> {
// Handle wallet state changes
println!("Wallet event: {:?}", op);
Ok(())
}
fn emit_identity_event(&self, wallet_id: &str, event: IdentityEvent) -> Result<(), Box<dyn std::error::Error>> {
// Handle identity events
println!("Identity event: {:?}", event);
Ok(())
}
}
pub struct XaeroID {
pub did_peer: [u8; 897], // Falcon-512 public key
pub did_peer_len: u16, // Actual length used
pub secret_key: [u8; 1281], // Falcon-512 secret key
pub credential: XaeroCredential, // Embedded VC
}
pub struct XaeroWallet {
pub identity: XaeroID, // Core identity
pub wallet_proofs: [WalletProofEntry; 16], // ZK proof storage
pub wallet_proof_count: u16, // Number of proofs
}
XaeroID implements several Groth16 circuits for privacy-preserving operations:
Proves group membership without revealing the member's identity:
Constraint: token_commitment = member_token + randomness
Constraint: member_token = group_id
Public: token_commitment, group_id
Private: member_token, randomness
Proves sufficient authority without revealing exact role:
Constraint: my_role >= min_role (via bit decomposition)
Public: min_role
Private: my_role
Proves object creation rights:
Constraint: creator_role >= min_creation_role
Constraint: new_object_root = object_seed + creator_role
Public: min_creation_role, new_object_root
Private: creator_role, object_seed
// Pure wallet operations - no external dependencies
let mut wallet = XaeroWallet::new(identity);
wallet.prove_and_store_membership(group_id, randomness)?;
let proofs = wallet.find_wallet_proofs(WalletProofType::Membership);
// With event emission for external systems
struct MyEventBridge;
impl WalletEventSink for MyEventBridge {
fn emit_wallet_event(&self, wallet_id: &str, op: WalletCrdtOp) -> Result<(), Box<dyn std::error::Error>> {
// Forward to your event system
my_event_system.publish(wallet_id, op);
Ok(())
}
}
let bridge = MyEventBridge;
wallet.prove_and_store_membership_with_sink(group_id, randomness, Some(&bridge))?;
// Pod-safe serialization
let wallet_bytes = wallet.to_bytes();
let recovered_wallet = XaeroWallet::from_bytes(wallet_bytes).unwrap();
// Store to file, database, or network
std::fs::write("wallet.bin", wallet_bytes)?;
ark-bn254
- Elliptic curve for SNARKsark-groth16
- Groth16 proof systempqcrypto-falcon
- Post-quantum Falcon signaturesbytemuck
- Pod-safe serializationblake3
- Cryptographic hashingmultibase
- DID encodingtrivial_bounds
featureMIT License - see LICENSE file for details.
We welcome contributions! Please see CONTRIBUTING.md for guidelines.
git clone https://github.com/your-org/xaeroid
cd xaeroid
cargo test
cargo run --example basic_wallet
cargo run --example credential_flow
cargo run --example zk_proofs
XaeroID - Secure, Private, Post-Quantum Identity for the Decentralized Web