use affinidi_secrets_resolver::secrets::{KeyType, Secret};
use async_trait::async_trait;
use ed25519_dalek::{SigningKey, ed25519::signature::SignerMut};
use crate::DataIntegrityError;
#[async_trait]
pub trait Signer: Send + Sync {
fn key_type(&self) -> KeyType;
fn verification_method(&self) -> &str;
async fn sign(&self, data: &[u8]) -> Result<Vec<u8>, DataIntegrityError>;
}
#[async_trait]
impl Signer for Secret {
fn key_type(&self) -> KeyType {
self.get_key_type()
}
fn verification_method(&self) -> &str {
&self.id
}
async fn sign(&self, data: &[u8]) -> Result<Vec<u8>, DataIntegrityError> {
let private_bytes: [u8; 32] =
self.get_private_bytes()
.try_into()
.map_err(|_| {
DataIntegrityError::CryptoError("Invalid private key length".to_string())
})?;
let mut signing_key = SigningKey::from_bytes(&private_bytes);
Ok(signing_key.sign(data).to_vec())
}
}