use crate::keys::BlsKeypair;
use crate::{utils, Ed25519Digest, Error, Keypair, PublicKey, Signature, XorName};
use ed25519_dalek::Keypair as Ed25519Keypair;
use multibase::Decodable;
use rand::{CryptoRng, Rng};
use serde::{Deserialize, Deserializer, Serialize, Serializer};
use std::fmt::{self, Debug, Display, Formatter};
use threshold_crypto::{
serde_impl::SerdeSecret, SecretKey as BlsSecretKey, SecretKeyShare as BlsSecretKeyShare,
};
#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
pub struct FullId {
pub(super) keypair: Keypair,
public_id: PublicId,
}
impl FullId {
pub fn new_ed25519<T: CryptoRng + Rng>(rng: &mut T) -> Self {
let keypair = Keypair::new_ed25519(rng);
let public_key = keypair.public_key();
let public_id = PublicId {
name: public_key.into(),
public_key,
};
Self { keypair, public_id }
}
pub fn new_bls<T: CryptoRng + Rng>(rng: &mut T) -> Self {
let keypair = Keypair::new_bls(rng);
let public_key = keypair.public_key();
let public_id = PublicId {
name: public_key.into(),
public_key,
};
Self { keypair, public_id }
}
pub fn new_bls_share(bls_secret_key_share: BlsSecretKeyShare) -> Self {
let keypair = Keypair::new_bls_share(bls_secret_key_share);
let public_key = keypair.public_key();
let public_id = PublicId {
name: public_key.into(),
public_key,
};
Self { keypair, public_id }
}
pub fn sign<T: AsRef<[u8]>>(&self, data: T) -> Signature {
match &self.keypair {
Keypair::Ed25519(keys) => Signature::Ed25519(keys.sign::<Ed25519Digest>(data.as_ref())),
Keypair::Bls(keys) => Signature::Bls(keys.secret.inner().sign(data)),
Keypair::BlsShare(keys) => Signature::BlsShare(keys.secret.inner().sign(data)),
}
}
pub fn public_id(&self) -> &PublicId {
&self.public_id
}
}
impl From<BlsSecretKey> for FullId {
fn from(bls_sk: BlsSecretKey) -> Self {
let public = bls_sk.public_key();
let keypair = Keypair::Bls(BlsKeypair {
secret: SerdeSecret(bls_sk),
public,
});
let public_key = keypair.public_key();
let public_id = PublicId {
name: public_key.into(),
public_key,
};
Self { keypair, public_id }
}
}
impl From<Ed25519Keypair> for FullId {
fn from(ed25519_keypair: Ed25519Keypair) -> Self {
let keypair = Keypair::Ed25519(ed25519_keypair);
let public_key = keypair.public_key();
let public_id = PublicId {
name: public_key.into(),
public_key,
};
Self { keypair, public_id }
}
}
impl From<BlsSecretKeyShare> for FullId {
fn from(bls_secret_key_share: BlsSecretKeyShare) -> Self {
Self::new_bls_share(bls_secret_key_share)
}
}
#[derive(Clone, Eq, PartialEq, PartialOrd, Ord, Hash)]
pub struct PublicId {
name: XorName,
public_key: PublicKey,
}
impl PublicId {
pub fn name(&self) -> &XorName {
&self.name
}
pub fn public_key(&self) -> &PublicKey {
&self.public_key
}
pub fn encode_to_zbase32(&self) -> String {
utils::encode(&self)
}
pub fn decode_from_zbase32<T: Decodable>(encoded: T) -> Result<Self, Error> {
utils::decode(encoded)
}
}
impl Serialize for PublicId {
fn serialize<S: Serializer>(&self, serialiser: S) -> Result<S::Ok, S::Error> {
(&self.public_key).serialize(serialiser)
}
}
impl<'de> Deserialize<'de> for PublicId {
fn deserialize<D: Deserializer<'de>>(deserialiser: D) -> Result<Self, D::Error> {
let public_key: PublicKey = Deserialize::deserialize(deserialiser)?;
let name = public_key.into();
Ok(PublicId { name, public_key })
}
}
impl Debug for PublicId {
fn fmt(&self, formatter: &mut Formatter) -> fmt::Result {
write!(formatter, "Client({:?})", self.public_key)
}
}
impl Display for PublicId {
fn fmt(&self, formatter: &mut Formatter) -> fmt::Result {
Debug::fmt(self, formatter)
}
}