use beam::sea::{decrypt, encrypt, generate_pair, sign};
use serde_json::json;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let alice = generate_pair().await?;
let bob = generate_pair().await?;
println!("Alice's key pair generated");
println!("Bob's key pair generated");
let payload = json!({ "message": "Hello from Alice!" });
let signed = sign(&payload, &alice).await?;
let verified = beam::sea::verify(&signed, &alice.pub_key).await?;
assert_eq!(verified, payload);
println!("Signed and verified: {}", serde_json::to_string(&verified)?);
let wrong_key_result = beam::sea::verify(&signed, &bob.pub_key).await;
assert!(wrong_key_result.is_err());
let secret_data = json!({ "message": "Hello from Alice!" });
let encrypted = encrypt(&secret_data, &alice, bob.epub_key.as_deref()).await?;
println!("Encrypted with ECDH + AES-256-GCM");
let decrypted = decrypt(&encrypted, &bob, alice.epub_key.as_deref()).await?;
assert_eq!(decrypted, secret_data);
println!("Decrypted: {}", serde_json::to_string(&decrypted)?);
Ok(())
}