- Introduced DexExample.swift demonstrating decentralized exchange operations including spot trading, perpetual futures, liquidity provision, order book management, and portfolio tracking. - Added IbcExample.swift showcasing inter-blockchain communication operations such as cross-chain transfers, channel management, packet handling, and relayer operations. - Created ZkExample.swift illustrating zero-knowledge proof operations including circuit compilation, proof generation and verification, and trusted setup ceremonies.
233 lines
7.7 KiB
Kotlin
233 lines
7.7 KiB
Kotlin
package io.synor.examples
|
|
|
|
import io.synor.crypto.*
|
|
import io.synor.crypto.types.*
|
|
import kotlinx.coroutines.runBlocking
|
|
|
|
/**
|
|
* Synor Crypto SDK Examples for Kotlin
|
|
*
|
|
* Demonstrates quantum-resistant cryptographic operations:
|
|
* - Hybrid Ed25519 + Dilithium3 signatures
|
|
* - BIP-39 mnemonic generation and validation
|
|
* - Post-quantum algorithms (Falcon, SPHINCS+)
|
|
* - Key derivation functions
|
|
*/
|
|
fun main() = runBlocking {
|
|
// Initialize client
|
|
val config = CryptoConfig(
|
|
apiKey = System.getenv("SYNOR_API_KEY") ?: "your-api-key",
|
|
endpoint = "https://crypto.synor.io/v1",
|
|
timeout = 30_000,
|
|
retries = 3,
|
|
debug = false,
|
|
defaultNetwork = Network.MAINNET
|
|
)
|
|
|
|
val crypto = SynorCrypto(config)
|
|
|
|
try {
|
|
// Check service health
|
|
val healthy = crypto.healthCheck()
|
|
println("Service healthy: $healthy\n")
|
|
|
|
// Run examples
|
|
mnemonicExample(crypto)
|
|
keypairExample(crypto)
|
|
signingExample(crypto)
|
|
falconExample(crypto)
|
|
sphincsExample(crypto)
|
|
kdfExample(crypto)
|
|
hashExample(crypto)
|
|
} finally {
|
|
crypto.close()
|
|
}
|
|
}
|
|
|
|
suspend fun mnemonicExample(crypto: SynorCrypto) {
|
|
println("=== Mnemonic Operations ===")
|
|
|
|
// Generate a 24-word mnemonic (256-bit entropy)
|
|
val mnemonic = crypto.mnemonic.generate(24)
|
|
println("Generated mnemonic: ${mnemonic.phrase}")
|
|
println("Word count: ${mnemonic.wordCount}")
|
|
|
|
// Validate a mnemonic
|
|
val validation = crypto.mnemonic.validate(mnemonic.phrase)
|
|
println("Valid: ${validation.isValid}")
|
|
if (!validation.isValid) {
|
|
println("Error: ${validation.error}")
|
|
}
|
|
|
|
// Convert mnemonic to seed
|
|
val seed = crypto.mnemonic.toSeed(mnemonic.phrase, "optional-passphrase")
|
|
println("Seed (hex): ${seed.toHex().take(32)}...")
|
|
|
|
// Word suggestions for autocomplete
|
|
val suggestions = crypto.mnemonic.suggestWords("aban", limit = 5)
|
|
println("Suggestions for 'aban': ${suggestions.joinToString(", ")}")
|
|
|
|
println()
|
|
}
|
|
|
|
suspend fun keypairExample(crypto: SynorCrypto) {
|
|
println("=== Keypair Operations ===")
|
|
|
|
// Generate a random keypair
|
|
val keypair = crypto.keypairs.generate()
|
|
println("Generated hybrid keypair:")
|
|
println(" Ed25519 public key size: ${keypair.publicKey.ed25519Bytes.size} bytes")
|
|
println(" Dilithium public key size: ${keypair.publicKey.dilithiumBytes.size} bytes")
|
|
println(" Total public key size: ${keypair.publicKey.size} bytes")
|
|
|
|
// Get addresses for different networks
|
|
println("\nAddresses:")
|
|
println(" Mainnet: ${keypair.getAddress(Network.MAINNET)}")
|
|
println(" Testnet: ${keypair.getAddress(Network.TESTNET)}")
|
|
println(" Devnet: ${keypair.getAddress(Network.DEVNET)}")
|
|
|
|
// Create keypair from mnemonic (deterministic)
|
|
val mnemonic = crypto.mnemonic.generate(24)
|
|
val keypair2 = crypto.keypairs.fromMnemonic(mnemonic.phrase, "")
|
|
val addr = keypair2.getAddress(Network.MAINNET)
|
|
println("\nKeypair from mnemonic: ${addr.take(20)}...")
|
|
|
|
// Derive child keypair using BIP-44 path
|
|
val path = DerivationPath.external(0, 0) // m/44'/21337'/0'/0/0
|
|
println("Derivation path: $path")
|
|
|
|
println()
|
|
}
|
|
|
|
suspend fun signingExample(crypto: SynorCrypto) {
|
|
println("=== Hybrid Signing ===")
|
|
|
|
// Generate keypair
|
|
val keypair = crypto.keypairs.generate()
|
|
|
|
// Sign a message
|
|
val message = "Hello, quantum-resistant world!".toByteArray()
|
|
val signature = crypto.signing.sign(keypair, message)
|
|
|
|
println("Signature created:")
|
|
println(" Ed25519 component: ${signature.ed25519Bytes.size} bytes")
|
|
println(" Dilithium component: ${signature.dilithiumBytes.size} bytes")
|
|
println(" Total signature size: ${signature.size} bytes")
|
|
|
|
// Verify the signature
|
|
val valid = crypto.signing.verify(keypair.publicKey, message, signature)
|
|
println("\nVerification result: $valid")
|
|
|
|
// Verify with tampered message fails
|
|
val tamperedMessage = "Hello, tampered message!".toByteArray()
|
|
val invalidResult = crypto.signing.verify(keypair.publicKey, tamperedMessage, signature)
|
|
println("Tampered message verification: $invalidResult")
|
|
|
|
println()
|
|
}
|
|
|
|
suspend fun falconExample(crypto: SynorCrypto) {
|
|
println("=== Falcon Post-Quantum Signatures ===")
|
|
|
|
// Generate Falcon-512 keypair (128-bit security)
|
|
val falcon512 = crypto.falcon.generate(FalconVariant.FALCON512)
|
|
println("Falcon-512 keypair:")
|
|
println(" Public key: ${falcon512.publicKey.keyBytes.size} bytes")
|
|
println(" Security level: 128-bit")
|
|
|
|
// Generate Falcon-1024 keypair (256-bit security)
|
|
val falcon1024 = crypto.falcon.generate(FalconVariant.FALCON1024)
|
|
println("\nFalcon-1024 keypair:")
|
|
println(" Public key: ${falcon1024.publicKey.keyBytes.size} bytes")
|
|
println(" Security level: 256-bit")
|
|
|
|
// Sign with Falcon-512
|
|
val message = "Post-quantum secure message".toByteArray()
|
|
val signature = crypto.falcon.sign(falcon512, message)
|
|
println("\nFalcon-512 signature: ${signature.signatureBytes.size} bytes")
|
|
|
|
// Verify
|
|
val valid = crypto.falcon.verify(falcon512.publicKey.keyBytes, message, signature)
|
|
println("Verification: $valid")
|
|
|
|
println()
|
|
}
|
|
|
|
suspend fun sphincsExample(crypto: SynorCrypto) {
|
|
println("=== SPHINCS+ Hash-Based Signatures ===")
|
|
|
|
// SPHINCS+ variants with different security levels
|
|
val variants = listOf(
|
|
Triple(SphincsVariant.SHAKE128S, 128, 7856),
|
|
Triple(SphincsVariant.SHAKE192S, 192, 16224),
|
|
Triple(SphincsVariant.SHAKE256S, 256, 29792)
|
|
)
|
|
|
|
// Generate and demonstrate each variant
|
|
for ((variant, security, sigSize) in variants) {
|
|
val keypair = crypto.sphincs.generate(variant)
|
|
println("SPHINCS+ $variant:")
|
|
println(" Security level: $security-bit")
|
|
println(" Expected signature size: $sigSize bytes")
|
|
|
|
// Sign a message
|
|
val message = "Hash-based quantum security".toByteArray()
|
|
val signature = crypto.sphincs.sign(keypair, message)
|
|
println(" Actual signature size: ${signature.signatureBytes.size} bytes")
|
|
|
|
// Verify
|
|
val valid = crypto.sphincs.verify(keypair.publicKey.keyBytes, message, signature)
|
|
println(" Verification: $valid\n")
|
|
}
|
|
}
|
|
|
|
suspend fun kdfExample(crypto: SynorCrypto) {
|
|
println("=== Key Derivation Functions ===")
|
|
|
|
// HKDF (HMAC-based Key Derivation Function)
|
|
val seed = "master-secret-key-material-here".toByteArray()
|
|
val hkdfConfig = DerivationConfig(
|
|
salt = "application-salt".toByteArray(),
|
|
info = "encryption-key".toByteArray(),
|
|
outputLength = 32
|
|
)
|
|
|
|
val derivedKey = crypto.kdf.deriveKey(seed, hkdfConfig)
|
|
println("HKDF derived key: ${derivedKey.toHex()}")
|
|
|
|
// PBKDF2 (Password-Based Key Derivation Function)
|
|
val password = "user-password".toByteArray()
|
|
val pbkdf2Config = PasswordDerivationConfig(
|
|
salt = "random-salt-value".toByteArray(),
|
|
iterations = 100_000,
|
|
outputLength = 32
|
|
)
|
|
|
|
val passwordKey = crypto.kdf.deriveFromPassword(password, pbkdf2Config)
|
|
println("PBKDF2 derived key: ${passwordKey.toHex()}")
|
|
|
|
println()
|
|
}
|
|
|
|
suspend fun hashExample(crypto: SynorCrypto) {
|
|
println("=== Hash Functions ===")
|
|
|
|
val data = "Data to hash".toByteArray()
|
|
|
|
// SHA3-256 (FIPS 202)
|
|
val sha3 = crypto.hash.sha3_256(data)
|
|
println("SHA3-256: ${sha3.hex}")
|
|
|
|
// BLAKE3 (fast, parallel)
|
|
val blake3 = crypto.hash.blake3(data)
|
|
println("BLAKE3: ${blake3.hex}")
|
|
|
|
// Keccak-256 (Ethereum compatible)
|
|
val keccak = crypto.hash.keccak256(data)
|
|
println("Keccak: ${keccak.hex}")
|
|
|
|
println()
|
|
}
|
|
|
|
// Extension function to convert ByteArray to hex string
|
|
fun ByteArray.toHex(): String = joinToString("") { "%02x".format(it) }
|