#![cfg(all(feature = "std", feature = "keyring", feature = "serde"))]
use gsigner::{keyring::KeyringScheme, signer::Signer};
fn assert_scheme_works<S: KeyringScheme>() {
let signer = Signer::<S>::memory();
let public = signer.generate().unwrap();
assert!(signer.has_key(public.clone()).unwrap());
let message = b"test message for signing";
let signature = signer.sign(public.clone(), message).unwrap();
signer.verify(public.clone(), message, &signature).unwrap();
let keys = signer.list_keys().unwrap();
assert!(keys.contains(&public));
signer.clear_keys().unwrap();
assert!(!signer.has_key(public).unwrap());
}
#[cfg(feature = "secp256k1")]
#[test]
fn test_secp256k1_scheme_works() {
assert_scheme_works::<gsigner::schemes::secp256k1::Secp256k1>();
}
#[cfg(feature = "ed25519")]
#[test]
fn test_ed25519_scheme_works() {
assert_scheme_works::<gsigner::schemes::ed25519::Ed25519>();
}
#[cfg(feature = "sr25519")]
#[test]
fn test_sr25519_scheme_works() {
assert_scheme_works::<gsigner::schemes::sr25519::Sr25519>();
}
#[cfg(feature = "secp256k1")]
#[test]
fn test_full_workflow_secp256k1() {
use gsigner::schemes::secp256k1::Secp256k1;
let signer = Signer::<Secp256k1>::memory();
let public1 = signer.generate().unwrap();
let message = b"hello world";
let sig1 = signer.sign(public1, message).unwrap();
signer.verify(public1, message, &sig1).unwrap();
let private = signer.private_key(public1).unwrap();
let signer2 = Signer::<Secp256k1>::memory();
let public2 = signer2.import(private).unwrap();
assert_eq!(public1, public2);
let sig2 = signer2.sign(public2, message).unwrap();
signer.verify(public1, message, &sig2).unwrap();
signer2.verify(public2, message, &sig1).unwrap();
}
#[cfg(feature = "sr25519")]
#[test]
fn test_full_workflow_sr25519() {
use gsigner::schemes::sr25519::Sr25519;
let signer = Signer::<Sr25519>::memory();
let public1 = signer.generate().unwrap();
let message = b"hello sr25519";
let sig1 = signer.sign(public1, message).unwrap();
signer.verify(public1, message, &sig1).unwrap();
let private = signer.private_key(public1).unwrap();
let signer2 = Signer::<Sr25519>::memory();
let public2 = signer2.import(private).unwrap();
assert_eq!(public1, public2);
let sig2 = signer2.sign(public2, message).unwrap();
signer2.verify(public2, message, &sig2).unwrap();
}
#[cfg(feature = "ed25519")]
#[test]
fn test_full_workflow_ed25519() {
use gsigner::schemes::ed25519::Ed25519;
let signer = Signer::<Ed25519>::memory();
let public1 = signer.generate().unwrap();
let message = b"hello ed25519";
let sig1 = signer.sign(public1, message).unwrap();
signer.verify(public1, message, &sig1).unwrap();
let private = signer.private_key(public1).unwrap();
let signer2 = Signer::<Ed25519>::memory();
let public2 = signer2.import(private).unwrap();
assert_eq!(public1, public2);
let sig2 = signer2.sign(public2, message).unwrap();
signer2.verify(public2, message, &sig2).unwrap();
}
#[cfg(feature = "secp256k1")]
#[test]
fn test_sign_with_nonexistent_key() {
use gsigner::schemes::secp256k1::{PrivateKey, Secp256k1};
let signer = Signer::<Secp256k1>::memory();
let private = PrivateKey::random();
let public = private.public_key();
let result = signer.sign(public, b"test");
assert!(result.is_err());
}
#[cfg(feature = "secp256k1")]
#[test]
fn test_verify_with_wrong_signature() {
use gsigner::schemes::secp256k1::Secp256k1;
let signer = Signer::<Secp256k1>::memory();
let public = signer.generate().unwrap();
let message = b"correct message";
let signature = signer.sign(public, message).unwrap();
let wrong_message = b"wrong message";
let result = signer.verify(public, wrong_message, &signature);
assert!(result.is_err());
}
#[cfg(feature = "secp256k1")]
#[test]
fn test_wrong_password_error() {
use gsigner::schemes::secp256k1::Secp256k1;
let signer = Signer::<Secp256k1>::memory();
let public = signer.generate_encrypted("correct_password").unwrap();
let result = signer.sign_encrypted(public, b"test", "wrong_password");
assert!(result.is_err());
let result = signer.sign(public, b"test");
assert!(result.is_err());
}
#[cfg(feature = "secp256k1")]
#[test]
fn test_sign_empty_data() {
use gsigner::schemes::secp256k1::Secp256k1;
let signer = Signer::<Secp256k1>::memory();
let public = signer.generate().unwrap();
let signature = signer.sign(public, b"").unwrap();
signer.verify(public, b"", &signature).unwrap();
}
#[cfg(feature = "secp256k1")]
#[test]
fn test_sign_large_data() {
use gsigner::schemes::secp256k1::Secp256k1;
let signer = Signer::<Secp256k1>::memory();
let public = signer.generate().unwrap();
let large_data = vec![0xABu8; 1024 * 1024];
let signature = signer.sign(public, &large_data).unwrap();
signer.verify(public, &large_data, &signature).unwrap();
}
#[cfg(feature = "secp256k1")]
#[test]
fn test_multiple_keys_in_signer() {
use gsigner::schemes::secp256k1::Secp256k1;
let signer = Signer::<Secp256k1>::memory();
let public1 = signer.generate().unwrap();
let public2 = signer.generate().unwrap();
let public3 = signer.generate().unwrap();
assert_ne!(public1, public2);
assert_ne!(public2, public3);
assert_ne!(public1, public3);
let keys = signer.list_keys().unwrap();
assert_eq!(keys.len(), 3);
assert!(keys.contains(&public1));
assert!(keys.contains(&public2));
assert!(keys.contains(&public3));
let message = b"test";
let sig1 = signer.sign(public1, message).unwrap();
let sig2 = signer.sign(public2, message).unwrap();
let sig3 = signer.sign(public3, message).unwrap();
assert_ne!(sig1, sig2);
assert_ne!(sig2, sig3);
assert_ne!(sig1, sig3);
signer.verify(public1, message, &sig1).unwrap();
assert!(signer.verify(public1, message, &sig2).is_err());
assert!(signer.verify(public2, message, &sig1).is_err());
}
#[cfg(feature = "secp256k1")]
#[test]
fn test_filesystem_keyring_persistence() {
use gsigner::schemes::secp256k1::Secp256k1;
let temp_dir = tempfile::tempdir().unwrap();
let keyring_path = temp_dir.path().to_path_buf();
let public = {
let signer = Signer::<Secp256k1>::fs(keyring_path.clone()).unwrap();
signer.generate().unwrap()
};
let signer2 = Signer::<Secp256k1>::fs(keyring_path).unwrap();
assert!(signer2.has_key(public).unwrap());
let signature = signer2.sign(public, b"persisted").unwrap();
signer2.verify(public, b"persisted", &signature).unwrap();
}
#[cfg(feature = "secp256k1")]
#[test]
fn test_sub_signer() {
use gsigner::schemes::secp256k1::Secp256k1;
let signer = Signer::<Secp256k1>::memory();
let public1 = signer.generate().unwrap();
let public2 = signer.generate().unwrap();
let public3 = signer.generate().unwrap();
let sub_signer = signer.sub_signer(vec![public1, public3]).unwrap();
assert!(sub_signer.has_key(public1).unwrap());
assert!(!sub_signer.has_key(public2).unwrap());
assert!(sub_signer.has_key(public3).unwrap());
sub_signer.sign(public1, b"test").unwrap();
sub_signer.sign(public3, b"test").unwrap();
assert!(sub_signer.sign(public2, b"test").is_err());
}