use crate::{object, Client};
use signatory::{ed25519, Error, PublicKeyed};
pub struct Signer {
client: Client,
signing_key_id: object::Id,
}
impl Signer {
pub fn create(client: Client, signing_key_id: object::Id) -> Result<Self, Error> {
let signer = Self {
client,
signing_key_id,
};
signer.public_key()?;
Ok(signer)
}
}
impl PublicKeyed<ed25519::PublicKey> for Signer {
fn public_key(&self) -> Result<ed25519::PublicKey, Error> {
let public_key = self.client.get_public_key(self.signing_key_id)?;
public_key.ed25519().ok_or_else(Error::new)
}
}
impl signatory::Signer<ed25519::Signature> for Signer {
fn try_sign(&self, msg: &[u8]) -> Result<ed25519::Signature, Error> {
Ok(self.client.sign_ed25519(self.signing_key_id, msg)?)
}
}