use super::prelude::*;
use ed25519::crypto::{derive_pubkey, bn_to_vec32, sc_reduce32};
use openssl::bn::BigNumContextRef;
use std::ops::Deref;
#[derive(Debug, Clone)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct PrivateKey([u8; 32]);
impl PrivateKey {
pub fn from_bytes(mut bytes: [u8; 32], ctx: &mut BigNumContextRef) -> Result<Self> {
let bn = sc_reduce32(&mut bytes, ctx)?;
let vec = bn_to_vec32(&bn);
{
let dest = &mut bytes[..];
dest.copy_from_slice(vec.as_slice());
}
Ok(PrivateKey(bytes))
}
#[inline]
pub fn into_bytes(self) -> [u8; 32] { self.0 }
#[inline]
pub fn to_bytes(&self) -> [u8; 32] { self.0 }
#[inline]
pub fn as_bytes(&self) -> &[u8; 32] { &self.0 }
}
impl Deref for PrivateKey {
type Target = [u8; 32];
#[inline]
fn deref(&self) -> &Self::Target { &self.0 }
}
impl AsRef<[u8]> for PrivateKey {
#[inline]
fn as_ref(&self) -> &[u8] { &self.0[..] }
}
#[derive(Debug, Clone)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct PublicKey([u8; 32]);
impl PublicKey {
pub fn from_private(priv_key: &PrivateKey, ctx: &mut BigNumContextRef) -> Result<Self> {
let mut bytes = priv_key.to_bytes();
derive_pubkey(&mut bytes, ctx)?;
Ok(PublicKey(bytes))
}
#[inline]
pub fn into_bytes(self) -> [u8; 32] { self.0 }
#[inline]
pub fn to_bytes(&self) -> [u8; 32] { self.0 }
#[inline]
pub fn as_bytes(&self) -> &[u8; 32] { &self.0 }
}
impl Deref for PublicKey {
type Target = [u8; 32];
#[inline]
fn deref(&self) -> &Self::Target { &self.0 }
}
impl AsRef<[u8]> for PublicKey {
#[inline]
fn as_ref(&self) -> &[u8] { &self.0[..] }
}
#[derive(Debug, Clone)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct Keypair {
pub public: PublicKey,
pub private: PrivateKey,
}