synor/sdk/rust/examples/crypto_example.rs
Gulshan Yadav 9416d76108 Add IBC and ZK SDK examples for Rust
- Introduced `ibc_example.rs` demonstrating Inter-Blockchain Communication operations including cross-chain transfers, channel management, packet handling, and relayer operations.
- Introduced `zk_example.rs` showcasing Zero-Knowledge proof operations such as circuit compilation, proof generation and verification, and on-chain verification with multiple proving systems.
2026-01-28 14:15:51 +05:30

279 lines
8.7 KiB
Rust

//! Synor Crypto SDK Examples for Rust
//!
//! Demonstrates quantum-resistant cryptographic operations:
//! - Hybrid Ed25519 + Dilithium3 signatures
//! - BIP-39 mnemonic generation and validation
//! - Post-quantum algorithms (Falcon, SPHINCS+)
//! - Key derivation functions
use std::env;
use synor_crypto::{
CryptoConfig, DerivationConfig, DerivationPath, FalconVariant, Network,
PasswordDerivationConfig, SphincsVariant, SynorCrypto,
};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// Initialize client
let config = CryptoConfig {
api_key: env::var("SYNOR_API_KEY").unwrap_or_else(|_| "your-api-key".to_string()),
endpoint: "https://crypto.synor.io/v1".to_string(),
timeout: 30000,
retries: 3,
debug: false,
default_network: Network::Mainnet,
};
let crypto = SynorCrypto::new(config)?;
// Check service health
let healthy = crypto.health_check().await?;
println!("Service healthy: {}\n", healthy);
// Run examples
mnemonic_example(&crypto).await?;
keypair_example(&crypto).await?;
signing_example(&crypto).await?;
falcon_example(&crypto).await?;
sphincs_example(&crypto).await?;
kdf_example(&crypto).await?;
hash_example(&crypto).await?;
crypto.close().await?;
Ok(())
}
async fn mnemonic_example(crypto: &SynorCrypto) -> Result<(), Box<dyn std::error::Error>> {
println!("=== Mnemonic Operations ===");
// Generate a 24-word mnemonic (256-bit entropy)
let mnemonic = crypto.mnemonic.generate(24).await?;
println!("Generated mnemonic: {}", mnemonic.phrase);
println!("Word count: {}", mnemonic.word_count);
// Validate a mnemonic
let validation = crypto.mnemonic.validate(&mnemonic.phrase).await?;
println!("Valid: {}", validation.valid);
if !validation.valid {
println!("Error: {}", validation.error.unwrap_or_default());
}
// Convert mnemonic to seed
let seed = crypto
.mnemonic
.to_seed(&mnemonic.phrase, Some("optional-passphrase"))
.await?;
println!("Seed (hex): {}...", &hex::encode(&seed)[..32]);
// Word suggestions for autocomplete
let suggestions = crypto.mnemonic.suggest_words("aban", 5).await?;
println!("Suggestions for 'aban': {}", suggestions.join(", "));
println!();
Ok(())
}
async fn keypair_example(crypto: &SynorCrypto) -> Result<(), Box<dyn std::error::Error>> {
println!("=== Keypair Operations ===");
// Generate a random keypair
let keypair = crypto.keypairs.generate().await?;
println!("Generated hybrid keypair:");
println!(
" Ed25519 public key size: {} bytes",
keypair.public_key.ed25519_bytes.len()
);
println!(
" Dilithium public key size: {} bytes",
keypair.public_key.dilithium_bytes.len()
);
println!(" Total public key size: {} bytes", keypair.public_key.size);
// Get addresses for different networks
println!("\nAddresses:");
println!(" Mainnet: {}", keypair.get_address(Network::Mainnet));
println!(" Testnet: {}", keypair.get_address(Network::Testnet));
println!(" Devnet: {}", keypair.get_address(Network::Devnet));
// Create keypair from mnemonic (deterministic)
let mnemonic = crypto.mnemonic.generate(24).await?;
let keypair2 = crypto
.keypairs
.from_mnemonic(&mnemonic.phrase, "")
.await?;
let addr = keypair2.get_address(Network::Mainnet);
println!("\nKeypair from mnemonic: {}...", &addr[..20]);
// Derive child keypair using BIP-44 path
let path = DerivationPath::external(0, 0); // m/44'/21337'/0'/0/0
println!("Derivation path: {}", path);
println!();
Ok(())
}
async fn signing_example(crypto: &SynorCrypto) -> Result<(), Box<dyn std::error::Error>> {
println!("=== Hybrid Signing ===");
// Generate keypair
let keypair = crypto.keypairs.generate().await?;
// Sign a message
let message = b"Hello, quantum-resistant world!";
let signature = crypto.signing.sign(&keypair, message).await?;
println!("Signature created:");
println!(
" Ed25519 component: {} bytes",
signature.ed25519_bytes.len()
);
println!(
" Dilithium component: {} bytes",
signature.dilithium_bytes.len()
);
println!(" Total signature size: {} bytes", signature.size);
// Verify the signature
let valid = crypto
.signing
.verify(&keypair.public_key, message, &signature)
.await?;
println!("\nVerification result: {}", valid);
// Verify with tampered message fails
let tampered_message = b"Hello, tampered message!";
let invalid_result = crypto
.signing
.verify(&keypair.public_key, tampered_message, &signature)
.await?;
println!("Tampered message verification: {}", invalid_result);
println!();
Ok(())
}
async fn falcon_example(crypto: &SynorCrypto) -> Result<(), Box<dyn std::error::Error>> {
println!("=== Falcon Post-Quantum Signatures ===");
// Generate Falcon-512 keypair (128-bit security)
let falcon512 = crypto.falcon.generate(FalconVariant::Falcon512).await?;
println!("Falcon-512 keypair:");
println!(" Public key: {} bytes", falcon512.public_key.key_bytes.len());
println!(" Security level: 128-bit");
// Generate Falcon-1024 keypair (256-bit security)
let falcon1024 = crypto.falcon.generate(FalconVariant::Falcon1024).await?;
println!("\nFalcon-1024 keypair:");
println!(
" Public key: {} bytes",
falcon1024.public_key.key_bytes.len()
);
println!(" Security level: 256-bit");
// Sign with Falcon-512
let message = b"Post-quantum secure message";
let signature = crypto.falcon.sign(&falcon512, message).await?;
println!(
"\nFalcon-512 signature: {} bytes",
signature.signature_bytes.len()
);
// Verify
let valid = crypto
.falcon
.verify(&falcon512.public_key.key_bytes, message, &signature)
.await?;
println!("Verification: {}", valid);
println!();
Ok(())
}
async fn sphincs_example(crypto: &SynorCrypto) -> Result<(), Box<dyn std::error::Error>> {
println!("=== SPHINCS+ Hash-Based Signatures ===");
// SPHINCS+ variants with different security levels
let variants = [
(SphincsVariant::Shake128s, 128, 7856),
(SphincsVariant::Shake192s, 192, 16224),
(SphincsVariant::Shake256s, 256, 29792),
];
// Generate and demonstrate each variant
for (variant, security, sig_size) in variants {
let keypair = crypto.sphincs.generate(variant).await?;
println!("SPHINCS+ {:?}:", variant);
println!(" Security level: {}-bit", security);
println!(" Expected signature size: {} bytes", sig_size);
// Sign a message
let message = b"Hash-based quantum security";
let signature = crypto.sphincs.sign(&keypair, message).await?;
println!(
" Actual signature size: {} bytes",
signature.signature_bytes.len()
);
// Verify
let valid = crypto
.sphincs
.verify(&keypair.public_key.key_bytes, message, &signature)
.await?;
println!(" Verification: {}\n", valid);
}
Ok(())
}
async fn kdf_example(crypto: &SynorCrypto) -> Result<(), Box<dyn std::error::Error>> {
println!("=== Key Derivation Functions ===");
// HKDF (HMAC-based Key Derivation Function)
let seed = b"master-secret-key-material-here";
let hkdf_config = DerivationConfig {
salt: b"application-salt".to_vec(),
info: b"encryption-key".to_vec(),
output_length: 32,
};
let derived_key = crypto.kdf.derive_key(seed, &hkdf_config).await?;
println!("HKDF derived key: {}", hex::encode(&derived_key));
// PBKDF2 (Password-Based Key Derivation Function)
let password = b"user-password";
let pbkdf2_config = PasswordDerivationConfig {
salt: b"random-salt-value".to_vec(),
iterations: 100000,
output_length: 32,
};
let password_key = crypto
.kdf
.derive_from_password(password, &pbkdf2_config)
.await?;
println!("PBKDF2 derived key: {}", hex::encode(&password_key));
println!();
Ok(())
}
async fn hash_example(crypto: &SynorCrypto) -> Result<(), Box<dyn std::error::Error>> {
println!("=== Hash Functions ===");
let data = b"Data to hash";
// SHA3-256 (FIPS 202)
let sha3 = crypto.hash.sha3_256(data).await?;
println!("SHA3-256: {}", sha3.hex);
// BLAKE3 (fast, parallel)
let blake3 = crypto.hash.blake3(data).await?;
println!("BLAKE3: {}", blake3.hex);
// Keccak-256 (Ethereum compatible)
let keccak = crypto.hash.keccak256(data).await?;
println!("Keccak: {}", keccak.hex);
println!();
Ok(())
}