synor/sdk/cpp/examples/crypto_example.cpp
Gulshan Yadav cf5130d9e4 feat(sdk): Add comprehensive examples for C, C++, C#, and Ruby SDKs
Add example code demonstrating all SDK services (Crypto, DEX, ZK, IBC,
Compiler) for the remaining languages:

- C SDK (5 examples): Using synor_* C API with explicit memory management
- C++ SDK (5 examples): Modern C++17 with RAII and designated initializers
- C# SDK (5 examples): Async/await patterns with .NET conventions
- Ruby SDK (5 examples): Ruby idioms with blocks and symbols

Each example covers:
- Crypto: Hybrid signatures, mnemonics, Falcon, SPHINCS+, KDF, hashing
- DEX: Markets, spot trading, perpetuals, liquidity, portfolio
- ZK: Circuits, Groth16, PLONK, STARK, recursive proofs, ceremonies
- IBC: Chains, channels, transfers, packets, relayer, monitoring
- Compiler: Compilation, optimization, ABI, analysis, validation, security
2026-01-28 14:44:04 +05:30

273 lines
10 KiB
C++

/**
* Synor Crypto SDK Examples for C++
*
* Demonstrates quantum-resistant cryptographic operations:
* - Hybrid Ed25519 + Dilithium3 signatures
* - BIP-39 mnemonic generation and validation
* - Post-quantum algorithms (Falcon, SPHINCS+)
* - Key derivation functions
*/
#include <iostream>
#include <iomanip>
#include <sstream>
#include <cstdlib>
#include <synor/crypto.hpp>
using namespace synor::crypto;
// Helper function to convert bytes to hex string
std::string bytes_to_hex(const std::vector<uint8_t>& data, size_t max_len = 0) {
std::stringstream ss;
size_t len = max_len > 0 && max_len < data.size() ? max_len : data.size();
for (size_t i = 0; i < len; ++i) {
ss << std::hex << std::setw(2) << std::setfill('0') << static_cast<int>(data[i]);
}
if (max_len > 0 && max_len < data.size()) {
ss << "...";
}
return ss.str();
}
void mnemonic_example(SynorCrypto& crypto) {
std::cout << "=== Mnemonic Operations ===" << std::endl;
// Generate a 24-word mnemonic (256-bit entropy)
auto mnemonic = crypto.mnemonic().generate(24);
std::cout << "Generated mnemonic: " << mnemonic.phrase() << std::endl;
std::cout << "Word count: " << mnemonic.word_count() << std::endl;
// Validate a mnemonic
auto validation = crypto.mnemonic().validate(mnemonic.phrase());
std::cout << "Valid: " << (validation.is_valid() ? "true" : "false") << std::endl;
if (!validation.is_valid()) {
std::cout << "Error: " << validation.error() << std::endl;
}
// Convert mnemonic to seed
auto seed = crypto.mnemonic().to_seed(mnemonic.phrase(), "optional-passphrase");
std::cout << "Seed (hex): " << bytes_to_hex(seed, 16) << std::endl;
// Word suggestions for autocomplete
auto suggestions = crypto.mnemonic().suggest_words("aban", 5);
std::cout << "Suggestions for 'aban': ";
for (size_t i = 0; i < suggestions.size(); ++i) {
std::cout << suggestions[i] << (i < suggestions.size() - 1 ? ", " : "");
}
std::cout << std::endl << std::endl;
}
void keypair_example(SynorCrypto& crypto) {
std::cout << "=== Keypair Operations ===" << std::endl;
// Generate a random keypair
auto keypair = crypto.keypairs().generate();
std::cout << "Generated hybrid keypair:" << std::endl;
std::cout << " Ed25519 public key size: " << keypair.public_key().ed25519_bytes().size() << " bytes" << std::endl;
std::cout << " Dilithium public key size: " << keypair.public_key().dilithium_bytes().size() << " bytes" << std::endl;
std::cout << " Total public key size: " << keypair.public_key().size() << " bytes" << std::endl;
// Get addresses for different networks
std::cout << "\nAddresses:" << std::endl;
std::cout << " Mainnet: " << keypair.get_address(Network::Mainnet) << std::endl;
std::cout << " Testnet: " << keypair.get_address(Network::Testnet) << std::endl;
std::cout << " Devnet: " << keypair.get_address(Network::Devnet) << std::endl;
// Create keypair from mnemonic (deterministic)
auto mnemonic = crypto.mnemonic().generate(24);
auto keypair2 = crypto.keypairs().from_mnemonic(mnemonic.phrase(), "");
auto addr = keypair2.get_address(Network::Mainnet);
std::cout << "\nKeypair from mnemonic: " << addr.substr(0, 20) << "..." << std::endl;
// Derive child keypair using BIP-44 path
auto path = DerivationPath::external(0, 0); // m/44'/21337'/0'/0/0
std::cout << "Derivation path: " << path.to_string() << std::endl;
std::cout << std::endl;
}
void signing_example(SynorCrypto& crypto) {
std::cout << "=== Hybrid Signing ===" << std::endl;
// Generate keypair
auto keypair = crypto.keypairs().generate();
// Sign a message
std::string message_str = "Hello, quantum-resistant world!";
std::vector<uint8_t> message(message_str.begin(), message_str.end());
auto signature = crypto.signing().sign(keypair, message);
std::cout << "Signature created:" << std::endl;
std::cout << " Ed25519 component: " << signature.ed25519_bytes().size() << " bytes" << std::endl;
std::cout << " Dilithium component: " << signature.dilithium_bytes().size() << " bytes" << std::endl;
std::cout << " Total signature size: " << signature.size() << " bytes" << std::endl;
// Verify the signature
bool valid = crypto.signing().verify(keypair.public_key(), message, signature);
std::cout << "\nVerification result: " << (valid ? "true" : "false") << std::endl;
// Verify with tampered message fails
std::string tampered_str = "Hello, tampered message!";
std::vector<uint8_t> tampered_message(tampered_str.begin(), tampered_str.end());
bool invalid_result = crypto.signing().verify(keypair.public_key(), tampered_message, signature);
std::cout << "Tampered message verification: " << (invalid_result ? "true" : "false") << std::endl;
std::cout << std::endl;
}
void falcon_example(SynorCrypto& crypto) {
std::cout << "=== Falcon Post-Quantum Signatures ===" << std::endl;
// Generate Falcon-512 keypair (128-bit security)
auto falcon512 = crypto.falcon().generate(FalconVariant::Falcon512);
std::cout << "Falcon-512 keypair:" << std::endl;
std::cout << " Public key: " << falcon512.public_key().key_bytes().size() << " bytes" << std::endl;
std::cout << " Security level: 128-bit" << std::endl;
// Generate Falcon-1024 keypair (256-bit security)
auto falcon1024 = crypto.falcon().generate(FalconVariant::Falcon1024);
std::cout << "\nFalcon-1024 keypair:" << std::endl;
std::cout << " Public key: " << falcon1024.public_key().key_bytes().size() << " bytes" << std::endl;
std::cout << " Security level: 256-bit" << std::endl;
// Sign with Falcon-512
std::string message_str = "Post-quantum secure message";
std::vector<uint8_t> message(message_str.begin(), message_str.end());
auto signature = crypto.falcon().sign(falcon512, message);
std::cout << "\nFalcon-512 signature: " << signature.signature_bytes().size() << " bytes" << std::endl;
// Verify
bool valid = crypto.falcon().verify(falcon512.public_key().key_bytes(), message, signature);
std::cout << "Verification: " << (valid ? "true" : "false") << std::endl;
std::cout << std::endl;
}
void sphincs_example(SynorCrypto& crypto) {
std::cout << "=== SPHINCS+ Hash-Based Signatures ===" << std::endl;
// SPHINCS+ variants with different security levels
struct VariantInfo {
SphincsVariant variant;
int security;
int sig_size;
std::string name;
};
std::vector<VariantInfo> variants = {
{SphincsVariant::Shake128s, 128, 7856, "SHAKE128S"},
{SphincsVariant::Shake192s, 192, 16224, "SHAKE192S"},
{SphincsVariant::Shake256s, 256, 29792, "SHAKE256S"},
};
std::string message_str = "Hash-based quantum security";
std::vector<uint8_t> message(message_str.begin(), message_str.end());
for (const auto& v : variants) {
auto keypair = crypto.sphincs().generate(v.variant);
std::cout << "SPHINCS+ " << v.name << ":" << std::endl;
std::cout << " Security level: " << v.security << "-bit" << std::endl;
std::cout << " Expected signature size: " << v.sig_size << " bytes" << std::endl;
// Sign a message
auto signature = crypto.sphincs().sign(keypair, message);
std::cout << " Actual signature size: " << signature.signature_bytes().size() << " bytes" << std::endl;
// Verify
bool valid = crypto.sphincs().verify(keypair.public_key().key_bytes(), message, signature);
std::cout << " Verification: " << (valid ? "true" : "false") << std::endl << std::endl;
}
}
void kdf_example(SynorCrypto& crypto) {
std::cout << "=== Key Derivation Functions ===" << std::endl;
// HKDF (HMAC-based Key Derivation Function)
std::string seed_str = "master-secret-key-material-here";
std::vector<uint8_t> seed(seed_str.begin(), seed_str.end());
std::string salt_str = "application-salt";
std::string info_str = "encryption-key";
DerivationConfig hkdf_config{
.salt = std::vector<uint8_t>(salt_str.begin(), salt_str.end()),
.info = std::vector<uint8_t>(info_str.begin(), info_str.end()),
.output_length = 32
};
auto derived_key = crypto.kdf().derive_key(seed, hkdf_config);
std::cout << "HKDF derived key: " << bytes_to_hex(derived_key) << std::endl;
// PBKDF2 (Password-Based Key Derivation Function)
std::string password_str = "user-password";
std::vector<uint8_t> password(password_str.begin(), password_str.end());
std::string pbkdf2_salt_str = "random-salt-value";
PasswordDerivationConfig pbkdf2_config{
.salt = std::vector<uint8_t>(pbkdf2_salt_str.begin(), pbkdf2_salt_str.end()),
.iterations = 100000,
.output_length = 32
};
auto password_key = crypto.kdf().derive_from_password(password, pbkdf2_config);
std::cout << "PBKDF2 derived key: " << bytes_to_hex(password_key) << std::endl;
std::cout << std::endl;
}
void hash_example(SynorCrypto& crypto) {
std::cout << "=== Hash Functions ===" << std::endl;
std::string data_str = "Data to hash";
std::vector<uint8_t> data(data_str.begin(), data_str.end());
// SHA3-256 (FIPS 202)
auto sha3 = crypto.hash().sha3_256(data);
std::cout << "SHA3-256: " << sha3.hex() << std::endl;
// BLAKE3 (fast, parallel)
auto blake3 = crypto.hash().blake3(data);
std::cout << "BLAKE3: " << blake3.hex() << std::endl;
// Keccak-256 (Ethereum compatible)
auto keccak = crypto.hash().keccak256(data);
std::cout << "Keccak: " << keccak.hex() << std::endl;
std::cout << std::endl;
}
int main(int argc, char** argv) {
// Initialize client
const char* api_key = std::getenv("SYNOR_API_KEY");
CryptoConfig config{
.api_key = api_key ? api_key : "your-api-key",
.endpoint = "https://crypto.synor.io/v1",
.timeout = std::chrono::seconds(30),
.retries = 3,
.debug = false,
.default_network = Network::Mainnet
};
SynorCrypto crypto(config);
try {
// Check service health
bool healthy = crypto.health_check();
std::cout << "Service healthy: " << (healthy ? "true" : "false") << std::endl << std::endl;
// Run examples
mnemonic_example(crypto);
keypair_example(crypto);
signing_example(crypto);
falcon_example(crypto);
sphincs_example(crypto);
kdf_example(crypto);
hash_example(crypto);
} catch (const std::exception& e) {
std::cerr << "Error: " << e.what() << std::endl;
return 1;
}
return 0;
}