#[derive(Clone)]
pub struct Signer {
pub pkey: Vec<u8>,
}
impl Signer {
pub fn new(pkey: impl Into<Vec<u8>>) -> Self {
Self { pkey: pkey.into() }
}
}
impl Signer {
pub fn sign_message(&self, message: &[u8]) -> Vec<u8> {
use p256::pkcs8::der::Encode;
let ec_key = openssl::ec::EcKey::private_key_from_pem(&self.pkey).unwrap();
let mut hasher = openssl::sha::Sha256::new();
hasher.update(message);
let hash = hasher.finish();
let signature = openssl::ecdsa::EcdsaSig::sign(hash.as_slice(), &ec_key).unwrap();
let signature: ecdsa::Signature<p256::NistP256> =
ecdsa::Signature::from_der(signature.to_der().unwrap().as_slice()).unwrap();
let mut v = vec![];
if let Some(signature) = signature.normalize_s() {
signature.to_der().encode_to_vec(&mut v).unwrap();
v
} else {
signature.to_der().encode_to_vec(&mut v).unwrap();
v
}
}
}