use super::super::{Error, Result};
use bls::{self, serde_impl::SerdeSecret};
use serde::{Deserialize, Serialize};
use std::fmt::{self, Debug, Display, Formatter};
#[derive(Debug, Serialize, Deserialize)]
pub enum SecretKey {
Ed25519(ed25519_dalek::SecretKey),
Bls(SerdeSecret<bls::SecretKey>),
BlsShare(SerdeSecret<bls::SecretKeyShare>),
}
impl SecretKey {
pub fn ed25519_from_hex(hex: &str) -> Result<Self> {
let bytes = hex::decode(hex).map_err(|err| {
Error::FailedToParse(format!(
"Couldn't parse edd25519 secret key bytes from hex: {err}"
))
})?;
let ed25519_sk = ed25519_dalek::SecretKey::from_bytes(bytes.as_ref()).map_err(|err| {
Error::FailedToParse(format!(
"Couldn't parse ed25519 secret key from bytes: {err}",
))
})?;
Ok(Self::Ed25519(ed25519_sk))
}
pub fn bls(&self) -> Option<bls::SecretKey> {
if let Self::Bls(key) = self {
Some(key.0.clone())
} else {
None
}
}
pub fn bls_share(&self) -> Option<bls::SecretKeyShare> {
if let Self::BlsShare(key) = self {
Some(key.0.clone())
} else {
None
}
}
pub fn ed25519(&self) -> Option<ed25519_dalek::SecretKey> {
if let Self::Ed25519(key) = self {
match ed25519_dalek::SecretKey::from_bytes(&key.to_bytes()) {
Ok(sk) => Some(sk),
Err(_) => None,
}
} else {
None
}
}
}
impl Display for SecretKey {
fn fmt(&self, formatter: &mut Formatter) -> fmt::Result {
Debug::fmt(self, formatter)
}
}