use aethel_sdk::{public_key_from_multibase, verify, verify_typed, Identity, Signature};
fn main() -> Result<(), Box<dyn std::error::Error>> {
let mut identity = Identity::generate()?;
let message = b"the message that was actually signed";
let multikey = identity.public_key_multibase();
let signature_json = identity.sign_typed(message)?.to_json()?;
let received_key = public_key_from_multibase(&multikey)?;
let received_signature = Signature::from_json(&signature_json)?;
assert!(verify_typed(&received_key, message, &received_signature)?);
assert!(!verify_typed(
&received_key,
b"something else",
&received_signature
)?);
let bytes_signature = identity.sign(message)?;
assert!(verify(identity.public_key(), message, &bytes_signature)?);
let key = b"a sealing key of thirty-two byte";
let sealed = identity.export_sealed(key)?;
let mut identity = Identity::open_sealed(&sealed, key)?;
let first = identity.project_at(b"checkout-session")?;
let second = identity.project_at(b"checkout-session")?;
assert_ne!(first.salt(), second.salt());
println!("ok: typed signed, verified, sealed, reopened and projected {multikey:.16}...");
Ok(())
}